0

この結果のデータを行ではなく列に表示したいと思います。のように: 2011_1 = ある値、2011_2 = ある値、...

SELECT      
        ls.Year,
        ls.Month, 
        lsq.Quantity
FROM    Log_Sales ls
        INNER JOIN Log_SalesQuantity lsq ON ls.Id = lsq.LogSalesId AND lsq.SaleStatisticTypeId = 1
WHERE   (ls.ProductId = 57983) AND
        (ls.BranchId = 1) AND           
        (ls.Year in (2011,2012,2013))

今、私はこの結果を得ます:

Year    Month   Quantity
2011    1   9220
2011    2   10211
2011    3   7269
2011    4   7050
2011    5   8543
2011    6   7539
2011    7   6103
2011    8   8905
2011    9   5588
2011    10  5840
2011    11  8041
2011    12  5991
2012    1   11233
2012    2   2829
2012    3   4440
2012    4   7842
2012    5   8557
2012    6   11299
2012    7   10560
2012    8   8350
2012    9   7627
2012    10  9511
2012    11  5293
2012    12  7030
2013    1   6148
2013    2   2774
2013    3   3737
2013    4   2350
2013    5   4016
2013    6   2300

ピボットを使用しようとすると、次のクエリまで取得します:

SELECT  [1] as '2013_1', [2]as '2013_2', [3]as '2013_3', [4]as '2013_4', [5]as '2013_5', [6]    
as '2013_6', [7]as '2013_7', [8]as '2013_8', [9]as '2013_9', [10]as '2013_10', [11]as '2013_11', 
[12]as '2013_12'
FROM
(SELECT     ls.Month, 
        lsq.Quantity
FROM    Log_Sales ls
        INNER JOIN Log_SalesQuantity lsq ON ls.Id = lsq.LogSalesId AND  
lsq.SaleStatisticTypeId = 1
WHERE   (ls.ProductId = 57983) AND
        (ls.BranchId = 1) AND           
        (ls.Year = 2013) ) AS SourceTable
PIVOT
(
sum(Quantity)
FOR [Month] IN ([1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12])
) AS PivotTable;

2013_1   2013_2 2013_3  2013_4  2013_5  2013_6  2013_7  2013_8  2013_9  2013_10 2013_11 2013_12
6148    2774    3737    2350    4016    2300    NULL    NULL    NULL    NULL    NULL    NULL

すでに良いことですが、3年間はダイナミックにしたいと考えています。今は 2011 年、2012 年、2013 年ですが、来年は 2012 年、2013 年、2014 年になります。

この結果に到達するための最良の方法は何ですか? たぶん、ピボット以外のソリューションがありますか?大規模でより複雑なクエリのこの部分に注意してください。

4

2 に答える 2

0

このsqlfiddleを使用して確認しました。年列と動的な場所を追加しました

SELECT year, [1] as 'jan', [2]as 'feb', [3]as 'mrt', [4]as 'apr', 
       [5] as 'may', [6] as 'jun', [7]as 'jul', [8] as 'aug', 
       [9]as 'sep', [10]as 'oct', [11]as 'nov',[12]as 'dec'
FROM
  (SELECT     ls.Month, 
              ls.Quantity,
              ls.Year
   FROM    Log_Sales ls
   WHERE   ls.Year > Year(GetDate()) -3 
   AND     ls.Year <= Year(GetDate())
  ) AS SourceTable
  PIVOT
  (
    sum(Quantity)
    FOR [Month] IN ( [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12])
  ) AS PivotTable
于 2013-06-14T09:28:19.597 に答える