3

私には2つのテーブルがあり、1つはすべての支店を持ち、もう1つはすべての売り上げを持っています。salesテーブルには、営業担当者ID、支店ID、月と年も含まれています。

支店と月でグループ化された、特定の担当者の1年間の売上の合計を返すクエリが必要です。その月の支店に売上がなかった場合、クエリは0を返す必要があります。私は次のものを持っていますが、売り上げがない場合は0を返しません。

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
4

5 に答える 5

4

参加できるようにするには、「欠落している」データを追加する必要があります。

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
于 2009-07-08T14:36:44.157 に答える
2

Salesテーブルにレコードがない担当者も返すように、SalesにLEFTJOINを実行する必要があります。

于 2009-07-08T14:15:13.813 に答える
1

クエリがNULLを返す場合は、合体メソッドの1つを使用できますCOALESCE(SUM(...), 0)。リストの最初の非NULL値を返します...

于 2009-07-08T14:21:58.547 に答える
0

結合を内側から左外側に変更し、売り上げのないブランチにISNULL関数を追加しました。

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
于 2009-07-08T14:22:44.863 に答える
0

合計を正しくするには、左結合とisnullを使用する必要があります。

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

セールスマンが特定の月に売り上げを上げていない場合でも、月を表示するには、さらに作業を行う必要があります。

于 2009-07-08T14:24:32.333 に答える