2014-10-10 79 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  

这将导致只有实际有数据的月数。