1

行に私は月があります。列に私は1から31日があります。月の31日間のすべての販売の合計の最後に列を追加したいと思います。

SELECT * FROM (
    SELECT DATENAME(month, date) AS SaleMonth,
        DATEPART(dd,date) AS SaleDay FROM EnquiryMaster
    ) p PIVOT 
    (COUNT (SaleDay) FOR 
    SaleDay IN ( [1],[2],[3],[4],[5],[6],[7],[8],[9],[10],
                [11],[12],[13],[14],[15],[16],[17],[18],[19],[20],
                [21],[22],[23],[24],[25],[26],[27],[28],[29],[30],[31] )) AS pvt

このコードは、31日間の日ごとのデータを表示しますが、合計は表示しません。

4

3 に答える 3

2

これを月ごとの合計を表示する列として使用する場合、残念ながら簡単な方法はありません。次のようなものを使用できます。

SELECT SaleMonth,
   [1],[2],[3],[4],[5],[6],[7],[8],[9],[10],
                [11],[12],[13],[14],[15],[16],[17],[18],[19],[20],
                [21],[22],[23],[24],[25],[26],[27],[28],[29],[30],[31],

   ([1]+[2]+[3]+[4]+[5]+[6]+[7]+[8]+[9]+[10]+
                [11]+[12]+[13]+[14]+[15]+[16]+[17]+[18]+[19]+[20]+
                [21]+[22]+[23]+[24]+[25]+[26]+[27]+[28]+[29]+[30]+[31]) TotalMonth
FROM 
(
  SELECT DATENAME(month, date) AS SaleMonth,
    DATEPART(dd,date) AS SaleDay 
  FROM EnquiryMaster
) p 
PIVOT 
(
  COUNT (SaleDay) 
  FOR SaleDay IN ( [1],[2],[3],[4],[5],[6],[7],[8],[9],[10],
                [11],[12],[13],[14],[15],[16],[17],[18],[19],[20],
                [21],[22],[23],[24],[25],[26],[27],[28],[29],[30],[31] )
) AS pvt

SQL FiddlewithDemoを参照してください

これは、動的SQLを実装してデータをピボットする方が簡単な場合です。動的SQLを使用すると、値をハードコーディングする必要がなくなります。

動的SQLを使用する場合、クエリは次のようになります。

DECLARE @cols AS NVARCHAR(MAX),
    @colsTotal AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT ',' + QUOTENAME(DATEPART(dd,date)) 
                    from EnquiryMaster
                    group by DATEPART(dd,date)
                    order by DATEPART(dd,date)
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

select @colsTotal = STUFF((SELECT distinct '+' + QUOTENAME(DATEPART(dd,date)) 
                    from EnquiryMaster
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')



set @query = 'SELECT SaleMonth,' + @cols + ', '+ @colsTotal+' as GrandTotal from 
             (
                SELECT DATENAME(month, date) AS SaleMonth,
                  DATEPART(dd,date) AS SaleDay 
                FROM EnquiryMaster
            ) x
            pivot 
            (
                count(SaleDay)
                for SaleDay in (' + @cols + ')
            ) p '

execute(@query)

SQL FiddlewithDemoを参照してください

または、別の提案として、列ヘッダーをに変更して、毎月にをMonth実装して合計行を取得することもできます。GROUP BY with ROLLUP

したがって、新しい結果セットは次のようになります。

Day   | Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec
-------------------------------------------------------------------------------
1     |  12 | 34  | 5   |  3  | 3   |  2  | 32  |  0  | 9   | 87  | 23  | 54
Total |   ....
于 2012-12-13T11:50:11.763 に答える
0

条件の間で試してください

SELECT * FROM (SELECT DATENAME(month, date) AS SaleMonth,DATEPART(dd,date) AS SaleDay FROM EnquiryMaster) p PIVOT (COUNT (SaleDay) FOR SaleDay BETWEEN 1 and 31) AS pvt
于 2012-12-13T11:39:58.533 に答える
0

副選択にもう1列だけ追加してみてください。

SELECT * FROM (
    SELECT DATENAME(month, date) AS SaleMonth,
        DATEPART(dd,date) AS SaleDay,
        COUNT(*) OVER (PARTITION BY DATENAME(month, date)) AS MonthlyTotal
        FROM EnquiryMaster
    ) p PIVOT 
    (COUNT (SaleDay) FOR 
    SaleDay IN ( [1],[2],[3],[4],[5],[6],[7],[8],[9],[10],
                [11],[12],[13],[14],[15],[16],[17],[18],[19],[20],
                [21],[22],[23],[24],[25],[26],[27],[28],[29],[30],[31] )) AS pvt
于 2012-12-13T19:02:05.523 に答える