SQL Server按月分组

我有一个具有此架构的表

ItemID UserID Year IsPaid PaymentDate Amount

1 1 2009 0 2009-11-01 300

2 1 2009 0 2009-12-01 342

3 1 2010 0 2010-01-01 243

4 1 2010 0 2010-02-01 2543

5 1 2010 0 2010-03-01 475

我正在尝试查询显示每个月的总数的查询。 到目前为止,我已经尝试过DateDiff和嵌套选择,但都没有给我想要的东西。 我认为这是最接近的:

DECLARE @start [datetime] = 2010/4/1;

SELECT ItemID, IsPaid,

(SELECT SUM(Amount) FROM Payments WHERE Year = 2010 And DateDiff(m, PaymentDate, @start) = 0 AND UserID = 100) AS "Apr",

(SELECT SUM(Amount) FROM Payments WHERE Year = 2010 AND DateDiff(m, PaymentDate, @start) =1 AND UserID = 100) AS "May",

(SELECT SUM(Amount) FROM Payments WHERE Year = 2010 AND DateDiff(m, PaymentDate, @start) =2 AND UserID = 100) AS "Jun",

(SELECT SUM(Amount) FROM Payments WHERE Year = 2010 AND DateDiff(m, PaymentDate, @start) =3 AND UserID = 100) AS "Jul",

(SELECT SUM(Amount) FROM Payments WHERE Year = 2010 AND DateDiff(m, PaymentDate, @start) =4 AND UserID = 100) AS "Aug",

(SELECT SUM(Amount) FROM Payments WHERE Year = 2010 AND DateDiff(m, PaymentDate, @start) =5 AND UserID = 100) AS "Sep",

(SELECT SUM(Amount) FROM Payments WHERE Year = 2010 AND DateDiff(m, PaymentDate, @start) =6 AND UserID = 100) AS "Oct",

(SELECT SUM(Amount) FROM Payments WHERE Year = 2010 AND DateDiff(m, PaymentDate, @start) =7 AND UserID = 100) AS "Nov",

(SELECT SUM(Amount) FROM Payments WHERE Year = 2010 AND DateDiff(m, PaymentDate, @start) =8 AND UserID = 100) AS "Dec",

(SELECT SUM(Amount) FROM Payments WHERE Year = 2010 AND DateDiff(m, PaymentDate, @start) =9 AND UserID = 100) AS "Jan",

(SELECT SUM(Amount) FROM Payments WHERE Year = 2010 AND DateDiff(m, PaymentDate, @start) =10 AND UserID = 100) AS "Feb",

(SELECT SUM(Amount) FROM Payments WHERE Year = 2010 AND DateDiff(m, PaymentDate, @start) =11 AND UserID = 100) AS "Mar"

FROM LIVE L INNER JOIN Payments I ON I.LiveID = L.RECORD_KEY

WHERE UserID = 16178

但是当我应该获取值时,我只会得到空值。 我想念什么吗?

7个解决方案

101 votes

SELECT CONVERT(NVARCHAR(10), PaymentDate, 120) [Month], SUM(Amount) [TotalAmount]

FROM Payments

GROUP BY CONVERT(NVARCHAR(10), PaymentDate, 120)

ORDER BY [Month]

您也可以尝试:

SELECT DATEPART(Year, PaymentDate) Year, DATEPART(Month, PaymentDate) Month, SUM(Amount) [TotalAmount]

FROM Payments

GROUP BY DATEPART(Year, PaymentDate), DATEPART(Month, PaymentDate)

ORDER BY Year, Month

Dave Downs answered 2020-06-17T06:16:37Z

20 votes

将NVARCHAR的尺寸限制为7,提供给CONVERT以仅显示“ YYYY-MM”

SELECT CONVERT(NVARCHAR(7),PaymentDate,120) [Month], SUM(Amount) [TotalAmount]

FROM Payments

GROUP BY CONVERT(NVARCHAR(7),PaymentDate,120)

ORDER BY [Month]

Martyn Davis answered 2020-06-17T06:16:58Z

5 votes

我更喜欢结合Month和DateTime函数,如下所示:

GROUP BY DATEADD(MONTH, DATEDIFF(MONTH, 0, Created),0)

这两个函数共同将比指定日期部分(在此示例中为Month)小的日期分量归零。

您可以将datepart位更改为Month、DateTime、DAY等,这非常方便。

这样,您原始的SQL查询将类似于以下内容(由于我没有设置数据,因此无法对其进行测试,但它应该使您处于正确的轨道)。

DECLARE @start [datetime] = '2010-04-01';

SELECT

ItemID,

UserID,

DATEADD(MONTH, DATEDIFF(MONTH, 0, Created),0) [Month],

IsPaid,

SUM(Amount)

FROM LIVE L

INNER JOIN Payments I ON I.LiveID = L.RECORD_KEY

WHERE UserID = 16178

AND PaymentDate > @start

还有一件事:Month列键入为DateTime,如果您需要进一步处理该数据或将其映射为.NET对象,这也是一个不错的优势。

bounav answered 2020-06-17T06:17:36Z

3 votes

DECLARE @start [datetime] = 2010/4/1;

应该...

DECLARE @start [datetime] = '2010-04-01';

您所拥有的是将2010除以4,然后除以1,然后转换为日期。 从1900-01-01开始的第57.5天。

初始化后,尝试SELECT @start,以检查是否正确。

MatBailie answered 2020-06-17T06:18:05Z

3 votes

如果您需要经常执行此操作,则可能要向表中添加一个计算列PaymentMonth:

ALTER TABLE dbo.Payments ADD PaymentMonth AS MONTH(PaymentDate) PERSISTED

它被持久化并存储在表中-因此查询它实际上没有性能开销。 这是一个4字节的INT值-因此空间开销也很小。

一旦有了它,就可以简化查询,使其类似于以下内容:

SELECT ItemID, IsPaid,

(SELECT SUM(Amount) FROM Payments WHERE Year = 2010 And PaymentMonth = 1 AND UserID = 100) AS 'Jan',

(SELECT SUM(Amount) FROM Payments WHERE Year = 2010 And PaymentMonth = 2 AND UserID = 100) AS 'Feb',

.... and so on .....

FROM LIVE L

INNER JOIN Payments I ON I.LiveID = L.RECORD_KEY

WHERE UserID = 16178

marc_s answered 2020-06-17T06:18:34Z

1 votes

另一种不涉及在结果中添加列的方法是简单地将日期的CONVERT零置零,因此CONVERT和2016-07-16都将是2016-07-01-从而使它们按月相等。

如果您具有datetime(而不是CONVERT)值,则可以将其直接置零:

SELECT

DATEADD( day, 1 - DATEPART( day, [Date] ), [Date] ),

COUNT(*)

FROM

[Table]

GROUP BY

DATEADD( day, 1 - DATEPART( day, [Date] ), [Date] )

如果您有datetime值,则需要使用CONVERT删除“时段”部分:

SELECT

DATEADD( day, 1 - DATEPART( day, [Date] ), CONVERT( date, [Date] ) ),

COUNT(*)

FROM

[Table]

GROUP BY

DATEADD( day, 1 - DATEPART( day, [Date] ), CONVERT( date, [Date] ) )

Dai answered 2020-06-17T06:19:03Z

0 votes

现在,您的查询明确地只查看了年份= 2010的付款,但是,我想您的意思是让Jan / Feb / Mar实际代表2009。如果是这样,则需要针对这种情况进行一些调整。 不要继续查询每一列的总和值,而只是查询以月为单位的日期差的条件。 将其余的放在WHERE子句中。

SELECT

SUM( case when DateDiff(m, PaymentDate, @start) = 0

then Amount else 0 end ) AS "Apr",

SUM( case when DateDiff(m, PaymentDate, @start) = 1

then Amount else 0 end ) AS "May",

SUM( case when DateDiff(m, PaymentDate, @start) = 2

then Amount else 0 end ) AS "June",

SUM( case when DateDiff(m, PaymentDate, @start) = 3

then Amount else 0 end ) AS "July",

SUM( case when DateDiff(m, PaymentDate, @start) = 4

then Amount else 0 end ) AS "Aug",

SUM( case when DateDiff(m, PaymentDate, @start) = 5

then Amount else 0 end ) AS "Sep",

SUM( case when DateDiff(m, PaymentDate, @start) = 6

then Amount else 0 end ) AS "Oct",

SUM( case when DateDiff(m, PaymentDate, @start) = 7

then Amount else 0 end ) AS "Nov",

SUM( case when DateDiff(m, PaymentDate, @start) = 8

then Amount else 0 end ) AS "Dec",

SUM( case when DateDiff(m, PaymentDate, @start) = 9

then Amount else 0 end ) AS "Jan",

SUM( case when DateDiff(m, PaymentDate, @start) = 10

then Amount else 0 end ) AS "Feb",

SUM( case when DateDiff(m, PaymentDate, @start) = 11

then Amount else 0 end ) AS "Mar"

FROM

Payments I

JOIN Live L

on I.LiveID = L.Record_Key

WHERE

Year = 2010

AND UserID = 100

DRapp answered 2020-06-17T06:19:24Z

sql月度分组_SQL Server按月分组相关推荐

  1. server sql 本月最后一天_SQL Server 获取最后一天(指定时间的月最后一天日期)...

    /* author OceanHo @ 2015-10-23 10:14:21 获取指定时间字符串指定日期的月最后一天日期 */ IF OBJECT_ID('get_LastDayDate') IS ...

  2. oracle 动态sql列转行_SQL Server中动态列转行

    http://www.cnblogs.com/gaizai/p/3753296.html 一.本文所涉及的内容(Contents) 三.实现代码(SQL Codes) (一) 首先我们先创建一个测试表 ...

  3. sql数据透视_SQL Server中的数据科学:取消数据透视

    sql数据透视 In this article, in the series, we'll discuss understanding and preparing data by using SQL ...

  4. always on sql 收缩日志_SQL Server AlwaysOn日志收缩

    当前好多项目都在逐渐的采用SQL Server AlwaysOn架构来作为数据库的高可用集群技术. 并且当前微软的大多数产品.Citrix XenDesktop.XenApp.PVS.XenMobil ...

  5. 对于数据给定范围sql取数_SQL Server中的报表–根据给定日期范围内提取的数据创建图表

    对于数据给定范围sql取数 介绍 ( Introduction ) I recently heard from a lady from overseas who wanted to find a qu ...

  6. sql azure 语法_SQL Server + Azure:混合方案简介

    sql azure 语法 We hear a lot about hybrid SQL Server environments, but how to integrate my datacenter ...

  7. sql date 函数_SQL Server DATE函数–终极指南

    sql date 函数 Hey, folks! In this article, we will be focusing on the entire set of SQL Server Date Fu ...

  8. python中引入sql的优点_SQL Server 2017中的Python:增强的数据库内机器学习

    Microsoft SQL Server是一款优秀的关系型数据库管理系统,Python是目前流行的数据科学语言之一,拥有丰富的库生态系统.从SQL Server 2017的CTP 2.0版本开始,可以 ...

  9. java编译sql存过_SQL SERVER 临时表导致存储过程重编译(recompile)的一些探讨

    SQLSERVER为了确保返回正确的值,或者处于性能上的顾虑,有意不重用缓存在内存里的执行计划,而重新编译执行计划的这种行为,被称为重编译(recompile).那么引发存储过程重编译的条件有哪一些呢 ...

最新文章

  1. STM32 电机教程 32 - 基于ST X-CUBE-SPN7 无刷无感电机库的电机驱动实现
  2. 第18天学习Java的笔记-ArrayList
  3. php time相差12小时_PHP服务器时间差8小时解决方案
  4. Android下EditText中的字体不统一问题
  5. C# 视频监控系列(14):总结贴——VC++代码转成C#小结
  6. C#编程语言(六):枚举类型与结构类型
  7. Android 3D系列之基本概念篇
  8. html的音频播放,HTML5 音频播放 audio
  9. BlackArch 创建软件包
  10. OpenShift 4 - 下载OpenShift项目中的ImageStream
  11. 爬取网易某只股票2017-01到2018-01的数据
  12. python常用单词有多少_Python常用单词
  13. 二十七、单张图片上传预览
  14. python字典(dictionary)中get和items、iteritems方法
  15. 浅析移动互联浪潮之由来
  16. cmd运行sql文件
  17. APP加壳原理及常用脱壳方法介绍
  18. 设计模式(一):观察者模式与责任链模式的对比
  19. 系统架构设计方法论——Zachman
  20. 火箭双杀尼克斯 哈林组合和砍50分

热门文章

  1. 如何将bing搜索页面以HTML Mashup的方式嵌入到SAP C4C页面
  2. SAP C4C Embedded Component里Lead ID和Lead TI页面的关系
  3. SalesArea F4 help implementation
  4. Opportunity在Fiori cloud system上编辑之后超时的根源分析
  5. CRM呼叫中心toolbar的cancel按钮会导致session清理
  6. SAP Kyma(Extension Factory on SAP Cloud Platform)的架构简介
  7. SAP CRM事务码COMMPR01无法搜索Individual Object
  8. 查找窗口隐藏了怎么办_如何快速查找网站管理页面
  9. ionic2 html 转义,ionic2 基于ngx-translate实现多语言切换,翻译
  10. python标准库os中用来列出_Python 标准库 os 中用来列出指定文件夹中的文件和子文件夹列表的方式是listdir()。_高职高专数字资源平台答案_学小易找答案...