0

支払いと顧客の2つのテーブルがあります。

1、2、3、4、5 の 5 種類のお客様がいます。

特定の年の各月の顧客タイプ (1,2,3,4,5) ごとの合計支払い額を取得したいと考えています。

また、いずれかの顧客タイプに支払いがない場合は、0 にする必要があります。

以下は私の現在のクエリです:-

 SELECT 
                    "Month" = month(o.PaymentDate)
                     , "Year" = year(o.PaymentDate)
                     , Amount = sum(o.Amount)
                     , c.CustomerTypeID                  
                FROM
                    Payments o
                    INNER JOIN
                      Customers c ON o.CustomerID = c.CustomerID
                WHERE
                    o.PaymentDate >= convert(DATETIME, '1/1/2013 12:00:00 AM')
                    AND o.PaymentDate < convert(DATETIME, '12/31/2013 12:00:00 AM')
                GROUP BY
                    month(o.PaymentDate)
                  , year(o.PaymentDate)
                  ,c.CustomerTypeID     
                ORDER BY
                    year(o.PaymentDate)
                  , month(o.PaymentDate)
                      ,c.CustomerTypeID

そして結果は:-

月 年 金額 CustomerTypeID 1 2013 456 1 1 2013 678 2 1 2013 346 3 1 2013 3245 5

現在、CustomerType 4 のデータが提供されていないため、金額列に 0 を表示したいので、月と年は同じになります。

どんな体でも私を助けることができますか?

前もって感謝します。

4

3 に答える 3

1
SELECT 
    2013 as year,
    months.monthno,
    Amount = isnull(sum(o.Amount),0),
    c.CustomerTypeID  
FROM
    customers c 
         cross join     
    (select number monthNo from master..spt_values where type='p' and number between 1 and 12) months
         left join payments o
     ON o.CustomerID = c.CustomerID
     AND year(o.PaymentDate)=2013
     AND month(o.PaymentDate) = months.monthNo
GROUP BY
    months.monthno, c.CustomerTypeID
ORDER BY
    months.monthno, c.CustomerTypeID
于 2013-10-19T09:55:11.657 に答える
0

集計で使用する場合は、次の使用WHEREを真剣に検討する必要がありGROUP BY ALLますGROUP BY

から - MS Technet :

ALL を使用すると、グループの一部に検索条件を満たす行がない場合でも、クエリ結果には GROUP BY 句によって生成されたすべてのグループが含まれます。ALL を指定しないと、GROUP BY を含む SELECT ステートメントは、該当する行がないグループを表示しません。

SELECT 
                    "Month" = month(o.PaymentDate)
                     , "Year" = year(o.PaymentDate)
                     , Amount = sum(o.Amount)
                     , c.CustomerTypeID                  
                FROM
                    Payments o
                    INNER JOIN
                      Customers c ON o.CustomerID = c.CustomerID
                WHERE
                    o.PaymentDate >= convert(DATETIME, '1/1/2013 12:00:00 AM')
                    AND o.PaymentDate < convert(DATETIME, '12/31/2013 12:00:00 AM')
                GROUP BY ALL
                    month(o.PaymentDate)
                  , year(o.PaymentDate)
                  ,c.CustomerTypeID     
                ORDER BY
                    year(o.PaymentDate)
                  , month(o.PaymentDate)
                      ,c.CustomerTypeID
于 2013-10-19T09:58:51.230 に答える