T-SQL, Nullsummen ohne Spiel auf beitreten

stimmen
3

Ich habe zwei Tabellen, eine mit allen meinen Zweigen, und einen mit allen meinem Umsatz. Der Verkauf Tabelle enthält auch einen Verkaufsmitarbeiter-ID, eine Niederlassung ID, einen Monat und ein Jahr.

Ich brauche eine Abfrage, die die Summe eines bestimmten rep Umsatz für ein Jahr zurück, gruppiert nach Branchen und Monat, und die Abfrage muss 0 zurückgeben, wenn es in einem Zweig keine Verkäufe für diesen Monat gewesen. Ich habe die folgende, die nicht 0 zurück, wenn es keine Verkäufe sind:

SELECT
    s.Month,
    b.BranchName,
    SUM(s.InvoiceAmount) AS 'Sales'
FROM 
    Branch b
INNER JOIN
    Sales s ON s.BranchID = b.BranchID
WHERE
    s.Year = 2008
AND
    s.SalesRepID= 11
GROUP BY 
    s.Month,
    b.BranchName
ORDER BY 
    s.Month,
    b.BranchName
Veröffentlicht am 08/07/2009 um 15:13
quelle vom benutzer
In anderen Sprachen...                            


5 antworten

stimmen
4

Sie müssen die „fehlenden“ Daten hinzufügen zu können, um es zu verbinden.

SELECT
    b.BranchName,
    SUM(ISNULL(s.InvoiceAmount, 0)) AS 'Sales',
    s.Month
FROM 
    Branch b
    LEFT OUTER JOIN (
            SELECT
        b.BranchID AS BranchID
        , s.SalesRepID AS SalesRepID
        , Months.Month AS Month
        , Years.Year AS Year
        , 0 AS InvoiceAmount
      FROM 
          Sales s
          CROSS JOIN (
            SELECT 1 AS Month
            UNION ALL SELECT 2
            UNION ALL SELECT 3
            UNION ALL SELECT 4
            UNION ALL SELECT 5
            UNION ALL SELECT 6
            UNION ALL SELECT 7
            UNION ALL SELECT 8
            UNION ALL SELECT 9
            UNION ALL SELECT 10
            UNION ALL SELECT 11
            UNION ALL SELECT 12
            ) Months
          CROSS JOIN (
            SELECT 2007 AS Year
            UNION ALL SELECT 2008
            UNION ALL SELECT 2009
            ) Years
          CROSS JOIN Branch b
      UNION ALL SELECT 
        s.BranchID AS BranchID
        , s.SalesRepID AS SalesRepID
        , s.Month AS Month
        , s.Year AS Year
        , s.InvoiceAmount AS InvoiceAmount
      FROM Sales s      
    )s ON s.BranchID = b.BranchID    
WHERE
    s.Year = 2008
    AND s.SalesRepID= 11
GROUP BY 
    s.Month,
    b.BranchName
ORDER BY 
    b.BranchName,
    s.Month
Beantwortet am 08/07/2009 um 15:36
quelle vom benutzer

stimmen
2

Sie erhalten eine LEFT JOIN Verkäufe tun müssen, so wie auch die Wiederholungen zurückzugeben, die keine Datensätze in der Tabelle Sales haben.

Beantwortet am 08/07/2009 um 15:15
quelle vom benutzer

stimmen
1

Wenn Ihre Abfrage NULL zurückgibt, können Sie eine der koaleszierenden Methoden verwenden: COALESCE(SUM(...), 0)den ersten Nicht-NULL - Wert in der Liste zurückzukehren ...

Beantwortet am 08/07/2009 um 15:21
quelle vom benutzer

stimmen
0

Sie benötigen eine links zu verwenden, verbinden und eine isnull die Summe zu erhalten rechts:

SELECT    b.BranchName
,    SUM(isnull(s.InvoiceAmount, 0)) AS 'Sales'
FROM     Branch b
LEFT JOIN    Sales s ON s.BranchID = b.BranchID 
GROUP BY     s.Month,    b.BranchName
ORDER BY     s.Month,    b.BranchName

Sie müssen noch mit ihm etwas mehr Arbeit zu tun, die Monate zu bekommen zeigen auch, wenn ein Verkäufer keine Verkäufe in einem bestimmten Monat hat.

Beantwortet am 08/07/2009 um 15:24
quelle vom benutzer

stimmen
0

Ich habe die von der inneren Verknüpfung äußeren nach links und fügte die ISNULL Funktion für Zweige ohne Umsatz.

SELECT

    b.BranchName,
    s.Month,
    SUM(ISNULL(s.InvoiceAmount,0)) AS 'Sales'
FROM 
    Branch b
LEFT JOIN
    Sales s ON s.BranchID = b.BranchID
WHERE
    s.Year = 2008
AND
    s.SalesRepID= 11
GROUP BY 
    s.Month,
    b.BranchName
ORDER BY 
    s.Month,
    b.BranchName
Beantwortet am 08/07/2009 um 15:22
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more