Sql 用于按月合计数据的分区上的行
我有一些数据,我需要为每个月求和,我很难弄清楚如何让它有12列,每个月一列,与该月的总和 例如: 现有数据:Sql 用于按月合计数据的分区上的行,sql,tsql,window-functions,Sql,Tsql,Window Functions,我有一些数据,我需要为每个月求和,我很难弄清楚如何让它有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
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
July August September
0 51146.43 1099.81
对不起,我以前没有包括这个
我确信这是在分区上使用行的最基本的例子,也许是因为我缺乏编程背景,但这是一个我无法理解的概念
这就是我目前所拥有的,但我不确定下一步该去哪里
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
也许我需要的是一堂关于分区上的行如何工作的基础课。我试过阅读我在网上找到的文章,但没有一篇对我来说有意义,它们是一种进步的方式,我马上就迷路了,而且阅读对我的学习也没有帮助,我需要看到它的实际效果,并理解它是如何工作的
无论如何,谢谢你的帮助。你们太棒了!
编辑:
实际期望结果:
July August September
0 51146.43 1099.81
July August September
0 51146.43 1099.81
对不起,我以前没有包括这个 您需要使用PIVOT来获得所需的结果
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
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
这只会导致实际拥有数据的月份数。您可以使用DATENAMEMONTH、[ClaimDate]而不是awkard CASE表达式。我把期望的结果搞砸了。是我的错。我实际上在寻找这个:实际期望的结果:7月8月9月0日51146.43 1099.812很好的答案,但你也给出了很好的解释。谢谢你的解释。我没有投你反对票,但我唯一能想到的是,这完美地回答了我原来的问题,但我发布了一个编辑,基本上改变了整个问题。你回答了第一个问题。是我的错。但你的是我最初发布的内容。