2014-07-10 9 views
5

ja pierwsza tabela o nazwie „Zamówienia” i 2 tabela o nazwie „szczegóły”MySQL LEFT JOIN i SUM i pokazać 0 zamiast NULL

orders : 
order_id 
1 
2 
3 

details : 
id | order_id | qty 
1 | 1  | 2 
2 | 1  | 3 

Jak mogę wyświetlić w następujący sposób?

order_id | total 
1  | 5 
2  | 0 
3  | 0 

Próbowałem tej kwerendy, ale nie działa:

SELECT *, SUM(qty) AS total 
FROM order o 
LEFT JOIN details d 
    ON o.order_id = d.order_id 

Odpowiedz

7

Spróbuj tego:

SELECT o.order_id, IFNULL(SUM(d.qty),0) AS total 
FROM orders o 
    LEFT JOIN details d ON o.order_id = d.order_id 
GROUP BY order_id 
+0

Dziękuję, jestem wzruszony ... –

+0

@MarcusAdams '1 'GROUP BY grup przez pierwszą kolumnę, nie niezwykle czytelny, ale to działa. – Arth

+0

@Arth, dobrze wiedzieć, ale zdecydowanie mylące. –

5

to zrobi, o co prosicie. Zastąpi wartości zerowe wartością 0, jeśli istnieje zamówienie bez rekordu szczegółowego.

SELECT o.order_id, 
    coalesce(sum(d.qty), 0) 
from orders o 
left join details d 
    on o.order_id = d.order_id 
group by o.order_id; 

Link to SQL Fiddle Example.

+0

+1. . . Zastosowanie standardu ANSI 'coalesce()'. Przykład Fiddle SQL. Używanie aliasów tabel. Moja jedyna sugestia: aliasy tabel powinny być skrótami tabel, więc wolę 'o' i' d' niż 'a' i' b'. –

+0

@GordonLinoff Dzięki. Zaktualizowałem przykład i odpowiedź na Twoje sugestie. – SQLChao