2016-04-15 5 views
1

Ich versuche, die Abfrage unten für jeden Artikel für jeden Laden die Menge von jedem der 4 Artikel, die wir haben, zu erhalten. Es funktioniert gut, und ich habe die temporäre Tabelle erstellt, um zu versuchen, die Geschwindigkeit zu erhöhen, aber mein Problem ist, dass, wenn die Tabelle keine Zeilen für ein bestimmtes Produkt hat, das Produkt überhaupt nicht angezeigt wird.Zeige Elemente, selbst wenn 0 Zeilen mit Gruppe von

Ich möchte alle vier Produkte (prodNo) zeigen, unabhängig davon, ob tatsächlich Zeilen für diesen bestimmten Laden vorhanden sind.

Ich recherchierte diese Seite und konnte nicht etwas finden, das ähnlich genug für mich ist, um es herauszufinden.

CREATE TEMPORARY TABLE IF NOT EXISTS temp_invoice_dates AS 
(
    SELECT Invoice_detail.del_date,invoice_Detail.StoreNo,mast_stores.SDesc, invoice_Detail.ProdNo,sold_qty,retn_price,retn_qty,sold_price FROM Invoice_detail 
     LEFT JOIN mast_stores on invoice_detail.StoreNO=mast_stores.Snum 
     LEFT JOIN invoice on invoice_detail.Del_Date=invoice.Del_Date and invoice_detail.Invoice_No=invoice.Invoice_No 
     WHERE Cnum IN ('200','210') AND invoice_detail.Del_Date >= "2016-03-01" AND invoice_detail.Del_Date < "2016-04-01" 
); 

SELECT 
    temp_invoice_dates.StoreNo, 
    temp_invoice_dates.SDesc, 
    DATE_FORMAT(temp_invoice_dates.Del_Date,'%Y') as Year, 
    DATE_FORMAT(temp_invoice_dates.Del_Date,'%M') as Month, 
    temp_invoice_dates.ProdNo, 
    mast_items.IDesc, 
    SUM(sold_qty) as TotalIn, 
    SUM(retn_qty) as TotalOut, 
    ROUND(SUM((sold_qty*sold_price)-(retn_qty*retn_price)),2) as NetSales, 
    CONCAT(ROUND(SUM(retn_qty)/SUM(sold_qty),2)*100,'%') as StalePerc 
    FROM mast_Items 
    LEFT JOIN temp_invoice_dates on temp_invoice_dates.ProdNo=mast_items.Inum 
    WHERE mast_items.Inum in ('3502','3512','4162','4182') 
    GROUP BY temp_invoice_dates.StoreNo, ProdNo 
    ORDER BY temp_invoice_dates.StoreNo, ProdNo; 

Drop table temp_invoice_dates; 

Ergebnisse sind ähnlich:

StoreNo Product Count.... 
1  1  1 
1  2  5 
1  3  2 
1  4  1 
2  1  14 
2  2  1 
2  4  4 
3  2  33 
3  3  3 

Wo, wie ich es

StoreNo Product Count .... 
1  1  1 
1  2  5 
1  3  2 
1  4  1 
2  1  14 
2  2  1 
2  3  0 
2  4  4 
3  1  0 
3  2  33 
3  3  3 
3  4  0 
+0

Gibt es eine andere Tabelle, die die Master-Liste der 'StoreNo' Werte halten? – Uueerdo

+0

mast_stores hat alle Speicher Keine Informationen, der Schlüssel (leider) ist jedoch als snum gespeichert. – Jeff

Antwort

2

So etwas wie dies funktionieren sollte sein möchten.

SELECT sp.StoreNo, sp.ProdNo 
    , ...stuff... 
    , sp.IDesc, sp.SDesc 
    , ...more stuff... 
FROM (
    SELECT i.Inum AS ProdNo, s.Snum AS StoreNo 
     , i.IDesc, s.SDesc 
    FROM mast_Items AS i, mast_stores AS s 
    WHERE i.Inum IN ('3502','3512','4162','4182') 
    ) AS sp 
LEFT JOIN temp_invoice_dates AS tid 
    ON sp.ProdNo = tid.ProdNo 
    AND sp.StoreNo = tid.StoreNo 
GROUP BY sp.StoreNo, sp.ProdNo 
ORDER BY sp.StoreNo, sp.ProdNo 
; 

Normalerweise empfehle ich gegen Kreuz schließt sich (wie in der Unterabfrage zu sehen), aber in diesem Fall ist es genau das, was gebraucht wird. Wenn die Abfrage langsam ist, können Sie stattdessen die Unterabfrageergebnisse zuvor in eine temporäre Tabelle einfügen, diese indexieren und dann die temporäre Tabelle anstelle der Unterabfrage verwenden.

(Edit: sp Felder, wenn für die Gruppierung und Ergebnis zu erzielen, sollte)

+0

Habe es mit ein bisschen Feinschliff! Danke (ich musste nur die Bedingung AND an CNUM IN ('200', '210') an die Cross-Join-Abfrage hinzufügen. – Jeff

+0

Oh, tut mir leid, ich habe diese Bedingung in der früheren Abfrage nicht bemerkt (und/oder konnte nicht bestimmen, aus welcher Tabelle es war.) – Uueerdo

+0

Keine Sorge! Super hilfreich, danke! – Jeff

Verwandte Themen