Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 用于按月合计数据的分区上的行_Sql_Tsql_Window Functions - Fatal编程技术网

Sql 用于按月合计数据的分区上的行

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

我有一些数据,我需要为每个月求和,我很难弄清楚如何让它有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
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很好的答案,但你也给出了很好的解释。谢谢你的解释。我没有投你反对票,但我唯一能想到的是,这完美地回答了我原来的问题,但我发布了一个编辑,基本上改变了整个问题。你回答了第一个问题。是我的错。但你的是我最初发布的内容。