2017-02-13 5 views
0

正直なところ、数日間、ピボットテーブルの動作について学習しようとしています。 rightnow、私はピボットテーブルの行と列の合計を表示することができます。ここに設定しようとしているコードはありますか?列と行のピボット総数が正しい値を示していない

DECLARE @cols   AS NVARCHAR(MAX) 
DECLARE @colswithNoNulls AS NVARCHAR(MAX) 
DECLARE @query   AS NVARCHAR(MAX) 
DECLARE @tanggal_awal  DATE 
DECLARE @tanggal_akhir  DATE 
DECLARE @print    NVARCHAR(MAX) 
DECLARE @querycount  AS NVARCHAR(MAX) 

CREATE TABLE #datatable 
(
    product_id int, 
    product_date date, 
    product_ammount int 
) 


SET @tanggal_awal = convert(DATE,'02-01-2017') 
SET @tanggal_akhir = convert(DATE,DATEADD(dd,-1,(DATEADD(mm,1,@tanggal_awal)))) 

--SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+1,0)) 

INSERT INTO #datatable (product_id,product_date,product_ammount) VALUES 
      (1,GETDATE(),100), 
      (1,GETDATE(),900), 
      (2,DATEADD(DD,-1,GETDATE()),400), 
      (3,DATEADD(DD,4,GETDATE()),300), 
      (1,DATEADD(DD,4,GETDATE()),200), 
      (2,DATEADD(DD,2,GETDATE()),700), 
      (4,DATEADD(DD,-3,GETDATE()),1000), 
      (4,DATEADD(MM,1,GETDATE()),200), 
      (4,GETDATE(),750) 

;WITH CTE (datelist,maxdate) AS 
(
    SELECT CONVERT(INT,(MIN(DATEPART(day,@tanggal_awal)))) datelist, CONVERT(INT,MAX(DATEPART(day,product_date))) maxdate 
    FROM #datatable 
    UNION ALL 
    SELECT CONVERT(INT,(DATEPART(day,datelist))), CONVERT(INT,(DATEPART(day,@tanggal_akhir))) 
    FROM cte 
    WHERE datelist < maxdate 
) SELECT c.datelist 
    INTO #temp 
    FROM cte c 
    ORDER BY c.datelist 
    OPTION (maxrecursion 0) 

SELECT @cols = STUFF((SELECT ',' + QUOTENAME(CONVERT(int, datelist)) 
       FROM #temp 
       GROUP BY datelist 
       ORDER BY CONVERT(int, datelist) 
       FOR XML PATH(''), TYPE 
       ).value('.', 'NVARCHAR(MAX)') 
       ,1,1,'' 
       ) 


SELECT @colswithNoNulls = STUFF((SELECT ',ISNULL(' + QUOTENAME(CONVERT(int, datelist)) +',''0'') '+ QUOTENAME(CONVERT(int, datelist)) 
          FROM #temp 
          GROUP BY datelist 
          ORDER BY CONVERT(int, datelist) 
          FOR XML PATH(''), TYPE 
          ).value('.', 'NVARCHAR(MAX)') 
          ,1,1,'') 

SET @query = 
      'SELECT product_id, '+ @colswithNoNulls+', Total FROM 
      (
       select 
       ISNULL((CAST(b.product_id as nvarchar(30))), ''Total'') product_id, 
       coalesce(b.product_ammount,0) as product_ammount, 
       DATEPART(dd,(convert(CHAR(10), product_date, 120))) PivotDate, 
       SUM(product_ammount) over (partition by b.product_id) as Total 
       FROM #datatable b 
       WHERE product_date between @tanggal_awal and @tanggal_akhir 
       GROUP BY product_ammount,product_date,product_id 
       WITH ROllup 
      ) x 
      pivot 
      (
       sum(product_ammount) 
       for PivotDate in (' [email protected]+ ') 
      ) p 
      ORDER BY CASE when (product_id = ''Total'') then 1 else 0 end, product_id'   

EXECUTE sp_executesql @query ,N'@tanggal_awal DATE, @tanggal_akhir DATE', @tanggal_awal,@tanggal_akhir 

IF(OBJECT_ID('tempdb.dbo.#temp','U') IS NOT NULL) 
    BEGIN 
     TRUNCATE TABLE #temp 
     TRUNCATE TABLE #datatable 
     DROP TABLE #temp 
     DROP TABLE #datatable 
    END 
ELSE 
    BEGIN 
     SELECT '#temp is not created in this script' AS MESSAGE 
    END 

ご覧のとおり、結果はディスプレイに表示されます。しかし、右下の合計値は、この写真のように正確な合計値が2倍になっているので奇妙です。 enter image description here この問題を解決するにはどうすればよいですか?それは私にとって少し混乱していたからです。あなたの助けをありがとう:)

答えて

1

一般的に、私はロールアップの機能を完全に認識していません。 PIVOTクエリから。私はいくつかの空の行が(基本的には "Rollup"オプションからの小計の行)出てくることを発見したので、期待通りの結果を得るためには文ごとにGroupを変更しました。

   select 
      ISNULL((CAST(b.product_id as nvarchar(30))), 'Total') product_id, 
      coalesce(b.product_ammount,0) as product_ammount, 
      DATEPART(dd,(convert(CHAR(10), product_date, 120))) PivotDate, 
      SUM(product_ammount) over (partition by b.product_id) as Total 
      FROM #datatable b 
      WHERE product_date between @tanggal_awal and @tanggal_akhir 
      GROUP BY product_ammount,product_date,ROllup(product_id) 

親切に、あなたは所望の出力を得るでしょう、PIVOTでこのクエリを交換してください。

注:残念ですが、私はロールアップの機能について十分に理解していません。正しい説明をすることができません。

+0

だから、私はすべての単一の列をロールアップすべきではありませんか? btwロールアップの動作について何か説明がありますか?私はキューブを使うことを考えていますが、それほど素晴らしいものではありません。 –

+0

申し訳ありません現在、私はロールアップの動作について説明していません。私はPIVOTテーブルに関する知識を持っています。それは答えを見つけるのに役立ちます –

関連する問題