2017-12-31 55 views
0

In Postgres Ich habe die folgenden vier TabellenJoin Daten aus drei verknüpften Tabellen

user (
id, 
name 

); 
order(
id, 
user_id 
) 
service(
id, 
name 

); 
order_to_service(
id, 
order_id, 
service_id 
price 
); 

ich eine Abfrage schreiben möchten Benutzername, Anzahl der Aufträge dieses Benutzers zu sehen und wie viel Geld er für alle Bestellungen verbringen Beispiel:

name amount price 
Albert 100 3200 

Dies ist meine Abfrage

select u.name , count(o.user_id),sum(ots.price) 
from orders o inner join users u on u.id=o.user_id 
inner join order_to_service ots on ots.order_id = o.id 

where(o.user_id is not null) group by u.name 

Das ist mein res ult:

"Аlbert";55;29978 

Accodring zu diesem Ergebnis Benutzer mit dem Namen Albert verfügt über 55 Aufträge Aber mit dieser Abfrage

select count(*) from orders where user_id = (select id from users where name like 'Albert') 
Result is 33 

Was mit meinem ersten Abfrage falsch ist?

+0

Does diese Hilfe: https://stackoverflow.com/questions/39558439/correct-sum-with-multiple-subrecords-postgresql – sibert

+0

Ich glaube, Sie Benutzer aus dem Auftrag zählen und dann in der wo Bedingung, die Sie für nicht null o.user_id nicht null überprüfen sind, ist stattdessen Name albert überprüfen dann –

Antwort

1

Wenn die Beziehung zwischen Orders-Tabelle und Order_to_service Tabelle ein zu viele, dann müssten Sie den Preis pro Auftrag in Order_to_service Tabelle zusammenzufassen, bevor sie mit der Orders-Tabelle verbinden. Versuchen Sie folgendes:

select u.name , count(o.user_id),sum(ots.price_tot) 
from orders o inner join users u on u.id=o.user_id 
inner join (select order_id, sum(price) as price_tot 
      from order_to_service  
      group by order_id) ots 
      on ots.order_id = o.id 
where (o.user_id is not null) group by u.name