2014-10-10 51 views
0

我有一些數據我需要爲每個月進行總結,並且我無法弄清楚如何讓它有12列(每月一個),總計爲月。按分區劃分總計數據的分區

例子:

數據作爲:

GrossAmt ClaimDate 
49764.00 2014-08-21 00:00:00.000 
1382.43  2014-08-27 00:00:00.000 
602.77  2014-09-02 00:00:00.000 
497.04  2014-09-02 00:00:00.000 

期望的結果:

GrossAmt ClaimDate 
51146.43 August 
1099.81  September 

實際所需的結果:

July August September 
0  51146.43 1099.81 

對不起,我以前不包括此!

我相信這是使用row over partition的最基本的例子,也許這是我缺乏編程背景,但這是一個概念,我不能籠絡我的頭。

這是我到目前爲止,但我不知道下一步該去哪裏。

With CTE ([GrossAmt],ClaimMonth) 
AS(
SELECT TOP 10000 
     Sum([GrossAmt]) as TotalClaimAmt 
     ,CASE WHEN Month([ClaimDate]) = 1 THEN 'January' 
      WHEN Month([ClaimDate]) = 2 THEN 'February' 
      WHEN Month([ClaimDate]) = 3 THEN 'March' 
      WHEN Month([ClaimDate]) = 4 THEN 'April' 
      WHEN Month([ClaimDate]) = 5 THEN 'May' 
      WHEN Month([ClaimDate]) = 6 THEN 'June' 
      WHEN Month([ClaimDate]) = 7 THEN 'July' 
      WHEN Month([ClaimDate]) = 8 THEN 'August' 
      WHEN Month([ClaimDate]) = 9 THEN 'September' 
      WHEN Month([ClaimDate]) = 10 THEN 'October' 
      WHEN Month([ClaimDate]) = 11 THEN 'November' 
      WHEN Month([ClaimDate]) = 12 THEN 'Decmber' 
     End AS ClaimMonth 
    FROM [Database].[dbo].[Table] 
    ) 
    Group BY [ClaimDate] 
    ) 
    Select * From CTE 

也許我可能需要的是關於Row over分區如何工作的基本教程。我曾嘗試閱讀我在網上找到的文章,但沒有一篇看起來對我有意義,他們是先進的方式,我馬上就迷路了,也沒有幫助我通過閱讀學得不好,我需要看到它在行動中,並理解它是如何工作的。

無論如何,感謝您的幫助。你們好棒! 編輯:

實際所需的結果:

July August September 
0  51146.43 1099.81 

對不起,我以前不包括此!

+2

您可以使用'DATENAME(MONTH,[ClaimDate])'代替那個awkard'CASE'表達式 – Lamak 2014-10-10 15:04:28

+0

好的呼叫。謝謝! – 2014-10-10 15:22:49

回答

2

您需要使用PIVOT來得到想要的結果

CTE是做每月聚集和PIVOT用於對CTE結果行轉換爲水平列

;With CTE ([GrossAmt],MonthVal) 
AS(
SELECT TOP 10000 
     Sum([GrossAmt]) as GrossAmt, 
     DATEADD(MONTH, DATEDIFF(MONTH,0,ClaimDate), 0) as MonthVal 
    FROM [Table1] 
    Group BY DATEADD(MONTH, DATEDIFF(MONTH,0,ClaimDate), 0) 
) 
SELECT * FROM 
(Select [GrossAmt], DATENAME(MONTH,MonthVal) as ClaimMonth From CTE) t 
PIVOT 
(MAX(GrossAmt) for ClaimMonth in 
    ([January], [Febrauary], [March], [April], [May], [June], [July], 
    [August], [September], [October], [November], [December] 

) 
)pvt 
+1

2很好的答案,但你也給出了很好的解釋。謝謝你的解釋。現在它變得更有意義。 – 2014-10-10 17:35:09

-1
With CTE ([GrossAmt],ClaimMonth) 
AS(
SELECT TOP 10000 
     Sum([GrossAmt]) as TotalClaimAmt 
     ,DATENAME(MONTH, ClaimDate) AS ClaimMonth 
    FROM [Database].[dbo].[Table] 
    Group BY DATENAME(MONTH, ClaimDate) 
) 
Select * From CTE 
+0

我搞砸了我想要的結果。我的錯。我實際上正在尋找: 實際預期結果: 七月八月九月 0 51146.43 1099.81 – 2014-10-10 15:57:54

-1
select top 1000 
     datename(month, [ClaimDate]), SUM([GrossAmt]) 
    from [Table] 
group by datename(month, [ClaimDate]) 
+1

關注評論? – Paparazzi 2014-10-10 16:54:22

+0

我沒有讓你失望,但我能想到的唯一事情就是這完全回答了我原來的問題,但是我發佈了一個基本上改變了整個問題的編輯。你回答了第一個問題。我的錯。但是你對我最初發布的內容是正確的。 – 2014-10-10 18:05:04

0
DECLARE @Cols NVARCHAR(MAX); 
SELECT @Cols = STUFF((
       SELECT DISTINCT ', ' + QUOTENAME(DATENAME(MONTH,ClaimDate)) 
       FROM TABLENAME 
       FOR XML PATH(''), TYPE).value('.','NVARCHAR(MAX)'),1,2,'') 
DECLARE @Sql NVARCHAR(MAX); 

SET @Sql = 'SELECT ''GrossAmount'' AS AMOUNT_Sorted_By_DATE, 
' + @Cols + ' 
FROM 
(SELECT [GrossAmt], DATENAME(MONTH,ClaimDate) as ClaimMonth 
FROM TABLENAME GROUP BY MONTH(ClaimDate)) AS SourceTable 
PIVOT 
(
SUM(GrossAmt) 
FOR DATENAME(MONTH,ClaimDate) IN (' + @Cols + ') 
) AS PivotTable' 
EXECUTE sp_executesql @Sql  

這將導致只有實際有數據的月數。