2017-01-28 5 views
0

以下のクエリは、代わりに私が出しは次のようにする必要がありますので、月によって各製品の合計数量を取得したいというの

Service Date Product1 Product2 
01/Jun/2015 1   3 
02/Jun/2015 2   5 
01/Aug/2015 2   5 
02/Aug/2015 2   5 

次の結果を返すには、製品の合計数量を取得します。

Service Date Product1 Product2 
Jun/2015  3   8 
Aug/2015  4   10 

クエリ

DECLARE @cols AS nvarchar(max), 
     @query AS nvarchar(max) 
SELECT 
    @cols = STUFF((SELECT 
    ',' + QUOTENAME(Product_Name) 
    FROM dbo.Store INNER JOIN dbo.Servicelist ON dbo.Servicelist.Pro_ID = dbo.Store.Pro_ID 
    where CatID='2' 
    GROUP BY Product_Name 
    ORDER BY Product_Name 
    FOR xml PATH (''), TYPE) 
    .value('.', 'NVARCHAR(MAX)'), 1, 1, '') 
SET @query = 'SELECT Replace(CONVERT(NVARCHAR, Service_Date, 126), '' '', ''/'') AS [Service Date],' + @cols + ' from (select Service.Service_Date, Store.Product_Name, Servicelist.ProductQty FROM dbo.Service INNER JOIN dbo.Servicelist ON dbo.Service.Service_ID = dbo.Servicelist.Service_ID INNER JOIN dbo.Store ON dbo.Servicelist.Pro_ID = dbo.Store.Pro_ID) x pivot (SUM(ProductQty) for Product_Name in (' + @cols + ')) p ' 
EXECUTE (@query); 
+0

'サービスDate'のデータ型が何であると

Format(Service_Date,'MMM/yyyy') AS [Service Date] 

を交換?どのバージョンの 'Sql Server'を使用していますか? –

+0

タイプは日付 – Ayman

+0

どのバージョンのSQL SERVER? 2008,2012? –

答えて

0

アルターあなたのピボットクエリを自分自身をグループ化する日付を変更mmm/yyyyフォーマット

あなたは Sql Server 2012未満のものを使用している場合は3210
SET @query ='SELECT Format(Service_Date,''MMM/yyyy'') AS [Service Date],'+ @cols+' 
      FROM (SELECT Service.Service_Date, 
          Store.Product_Name, 
          Servicelist.ProductQty 
        FROM dbo.Service 
          INNER JOIN dbo.Servicelist 
            ON dbo.Service.Service_ID = dbo.Servicelist.Service_ID 
          INNER JOIN dbo.Store 
            ON dbo.Servicelist.Pro_ID = dbo.Store.Pro_ID) x 
        PIVOT (Sum(ProductQty) 
         FOR Product_Name IN ('+ @cols +')) p' 

その後、

Replace(RIGHT(CONVERT(CHAR(11), Service_Date, 106), 8), ' ', '/') AS [Service Date] 
1

Service_Dateを日付型であると仮定すると、これを試してください:ピボットでこの

よう

select 
    convert(char(3), Service_Date, 100) +'/'+ CONVERT(CHAR(4), Service_Date, 120), 
    sum(Product1), 
    sum(Product2) 
from t 
group by convert(char(3), Service_Date, 100) +'/'+ CONVERT(CHAR(4), Service_Date, 120);