2016-04-16 8 views
2

Sagen wir, ich habe eine Tabelle wie folgt aus:SQL immer ähnliche Werte

++++++++++++++++++ 
NAME |PRODUCT 
Bob |Apple 
Bob |Orange 
Bob |Banana 
Amy |Apple 
Amy |Watermelon 
Chris |Orange 
++++++++++++++++++ 

ich ausgeben wollen eine Tabelle, die wie folgt aussieht;

+++++++++++++++++++++++++++++++++++++++++++++++++ 
NAME | PRODUCTS_BOUGHT | PPL_BUYING_SAME_PRODUCTS 
Bob | 3    | 2 
Amy | 2    | 1 
Chris| 1    | 1 
+++++++++++++++++++++++++++++++++++++++++++++++++ 

Wie kann ich das tun? Ich weiß, dass ich die Spalten als Tempfields erstellen kann, aber wie schreibe ich den Code, um diese Werte zu erhalten?

Antwort

0
with c as (select count(a.name) cnt ,a.name from test a where exists(select 1 from test b where a.product =b.product and a.name<>b.name) 
group by a.name) 
SELECT A.NAME, COUNT(A.name) products_bought, cnt 

ppl_buying_same_product FROM TEST A JOIN c on(a.name = c.name) 
group by A.name,cnt; 
+1

@GordonLinoff hat einen besseren Job gemacht, wie immer. –

+1

imo, Es ist keine Reflexion über unsere Fähigkeiten ... aber wir lernen viel. SO ist ein besserer Ort, weil Leute wie diese bereit sind, ihre Fähigkeiten zu teilen :) –

1

Dies sollte das tun, was Sie wollen:

select p.name, count(distinct p.product) as numproducts, 
     count(distinct p2.name) as numpeople 
from products p left join 
    products p2 
    on p.product = p2.product and p.name <> p2.name 
group by p.name; 

Dies scheint eine ziemlich teure Abfrage. Es fällt mir aber nichts einfacheres ein.