2016-07-02 20 views
0

Ich habe eine Abfrage abgeschlossen, und es funktioniert einwandfrei. Jetzt arbeite ich daran, es so zu ändern, dass die Ausgabe [$0] statt NULL anzeigt.
Weiß jemand genau, wie man dazu?SQL Server - Verwenden von ISNULL, um NULL zu lesen

Das ist, was ich tat:

Select I.Store 
     , I.ISNULL([Inventory $ TOTAL],0) 
     , S.ISNULL([Sales $  TOTAL],0) 
     , R.ISNULL([Receipts $ TOTAL],0) 
From 
    (Select Store 
      , '$'+Cast(Sum(QTY*Cost) As Varchar(20)) [Inventory $ TOTAL] 
     From Inventory Group By Store 
    ) I 
Left Outer Join 
    (Select Store 
      , '$'+Cast(Sum(QTY*Unit_Price) As Varchar(20)) [Sales $ TOTAL] 
     From Sales Group By Store 
    ) S 
     On S.Store = I.Store 
Left Outer Join 
    (Select Store 
      , '$'+Cast(Sum(QTY*Unit_Cost) As Varchar(20)) [Receipts $ TOTAL] 
     From Receipts Group By Store 
    ) R 
     On R.Store = I.Store 

- Hier ist der Ausgang

Store Inventory TOTAL SALES TOTAL RECEIPTS TOTAL 
    01  $852.94   $12371.41  $1015.16 
    02  $4192.21   $3714.74  NULL 
    03  $215.73   NULL   NULL 
+0

ISNULL() ist genau wie Sie eine gute Lösung, wenn Sie einen einzelnen Wert testen. COALESCE ist großartig, wenn Sie den ersten Nullwert von mehr als nur 1 haben möchten. Sie können wahrscheinlich Ihre gesamte Abfrage in einem Statement mit einem linken Join im Speicher zwischen Ihren Tabellen schreiben, aber das ist noch etwas zu lernen. – Matt

Antwort

0
Select I.Store 
     , '$'+ ISNULL(Cast(Sum(I.QTY * I.Cost)  As Varchar(20)) , '0') AS [Inventory $ TOTAL] 
     , '$'+ ISNULL(Cast(Sum(S.QTY * S.Unit_Price) As Varchar(20)) , '0') AS [Sales $ TOTAL] 
     , '$'+ ISNULL(Cast(Sum(R.QTY * R.Unit_Cost) As Varchar(20)) , '0') AS [Receipts $ TOTAL] 
From Inventory I 
Left Outer Join Sales S On S.Store = I.Store 
Left Outer Join Receipts R On R.Store = I.Store 
GROUP BY I.Store 
+0

Danke @ M.Ali. Es ist genau so, wie es sein sollte. Ich konfigurierte die Abfrage, um die Ideen von Matt zu integrieren. Wie auch immer, ich sah, dass du etwas geschrieben hast; also habe ich es getestet. Vielen Dank – stopa

+0

Es scheint, als würde dies einen partiellen Cross-Join erzeugen, es sei denn, "Store" ist in den Tabellen "Inventory", "Sales" und "Receipts" eindeutig. Dies führt dazu, dass die für die SUM-Aggregate zurückgegebenen Werte im Vergleich zur Rückgabe der OP-Abfrage aufgebläht werden. – spencer7593

0

Ich vermute, dass das Problem, das Sie ist ein Tipp Problem auftritt. Die Unterabfragen ausdrücklich jeden Wert auf ein Zeichen gegossen, so dass Sie ein Zeichen für den NULL Standard verwenden sollen:

Select I.Store, 
     COALESCE(I.[Inventory $ TOTAL], '$0'), 
     COALESCE(S.[Sales $  TOTAL], '$0'), 
     COALESCE(R.[Receipts $ TOTAL], '$0') 

Ich ziehe COALESCE() zu ISNULL(), weil COALESCE() ist ANSI-Standard.

+0

WOW! Vielen Dank. Nachdem ich Ihren Kommentar @Gordon Linoff gesehen hatte, schrieb ich meine Anfrage wie folgt um (rationalisierte): (Wählen Sie I.Store, Coalesce (Summe (I.QTY * I.Kosten), '$ 0') As [Inventar $ TOTAL ], Koaleszieren (Summe (S.QTY * S.Unit_Price), '$ 0') Wie [Inventar $ TOTAL], Koaleszieren (Summe (R.QTY * R.Unit_Cost), '$ 0') Wie [Inventar $ TOTAL ] \t von Inventar I Left Outer Join Verkäufe S Auf S.Store = I.Store links außen Receipts R Auf R.Store Join = I.Store Gruppe von I.Store – stopa

+0

@stopa: Die umgeschriebene Abfrage ist werde ein partielles Kreuzprodukt erzeugen und die Werte der SUM() - Aggregate aufblasen. Sie hatten in der ursprünglichen Abfrage Recht, separate Inline-Ansichten, um die Aggregate aus jeder der Tabellen zu erstellen, und anschließend die einzelne Zeile für jeden Speicher. Ich schlage vor, dass Sie die Inline-Ansichten nur den einfachen numerischen Wert zurückgeben und dann die Formatierung in der äußeren Abfrage behandeln, * nachdem * Sie die Ersetzung der NULL behandeln. – spencer7593

0

Ich würde es so machen. Lassen Sie jede der Inline-Ansichten den einfachen numerischen Wert zurückgeben. Umschließen Sie in der äußeren Abfrage den numerischen Wert von jeder Inline-Ansicht in der SQL Server ISNULL-Funktion (oder der ANSI COALESCE-Funktion), und führen Sie dann die Formatierung dafür aus. Behandeln Sie alle Konvertierungen und Formatierungen in der äußersten Abfrage.

SELECT i.store 
     , '$'+CAST(ISNULL(i.si_total,0) AS VARCHAR(20)) AS [Inventory $ TOTAL] 
     , '$'+CAST(ISNULL(s.ss_total,0) AS VARCHAR(20)) AS [Sales $ TOTAL] 
     , '$'+CAST(ISNULL(r.sr_total,0) AS VARCHAR(20)) AS [Receipts $ TOTAL] 
    FROM (SELECT si.Store 
       , SUM(si.QTY*si.Cost)   AS si_total 
      FROM Inventory si 
      GROUP BY si.Store 
     ) i 
    LEFT 
    JOIN (SELECT ss.Store 
       , SUM(ss.QTY*ss.Unit_Price) AS ss_total 
      FROM Sales ss 
      GROUP BY ss.Store 
     ) s 
     ON s.Store = i.Store 
    LEFT 
    JOIN (SELECT sr.Store 
       , SUM(sr.QTY*sr.Unit_Cost) AS sr_total 
      FROM Receipts sr 
      GROUP BY sr.Store 
     ) r 
     ON r.Store = i.Store 
    ORDER BY i.Store 
+0

Sie haben mir noch eine andere Möglichkeit gezeigt, diese Abfrage zu schreiben, @ Spencer7593. Ich werde ein Experte in der Verwendung von ISNULL in MS SQL-Verwaltung. Vielen Dank. – stopa

+0

Diese Abfrage unterscheidet sich * signifikant * von der Abfrage in der Antwort von M.Ali (die ausgewählte Antwort.) Als ich diese Antwort kommentiert, ist diese Abfrage Gong, ein partielles Kreuzprodukt zu erzeugen, das zu viele Zeilen zurückgibt (was werden dann aggregiert.) Die Abfrage in dieser Antwort tut das nicht. – spencer7593