sql月度分组_SQL Server按月分组
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按月分组相关推荐
- server sql 本月最后一天_SQL Server 获取最后一天(指定时间的月最后一天日期)...
/* author OceanHo @ 2015-10-23 10:14:21 获取指定时间字符串指定日期的月最后一天日期 */ IF OBJECT_ID('get_LastDayDate') IS ...
- oracle 动态sql列转行_SQL Server中动态列转行
http://www.cnblogs.com/gaizai/p/3753296.html 一.本文所涉及的内容(Contents) 三.实现代码(SQL Codes) (一) 首先我们先创建一个测试表 ...
- sql数据透视_SQL Server中的数据科学:取消数据透视
sql数据透视 In this article, in the series, we'll discuss understanding and preparing data by using SQL ...
- always on sql 收缩日志_SQL Server AlwaysOn日志收缩
当前好多项目都在逐渐的采用SQL Server AlwaysOn架构来作为数据库的高可用集群技术. 并且当前微软的大多数产品.Citrix XenDesktop.XenApp.PVS.XenMobil ...
- 对于数据给定范围sql取数_SQL Server中的报表–根据给定日期范围内提取的数据创建图表
对于数据给定范围sql取数 介绍 ( Introduction ) I recently heard from a lady from overseas who wanted to find a qu ...
- sql azure 语法_SQL Server + Azure:混合方案简介
sql azure 语法 We hear a lot about hybrid SQL Server environments, but how to integrate my datacenter ...
- 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 ...
- python中引入sql的优点_SQL Server 2017中的Python:增强的数据库内机器学习
Microsoft SQL Server是一款优秀的关系型数据库管理系统,Python是目前流行的数据科学语言之一,拥有丰富的库生态系统.从SQL Server 2017的CTP 2.0版本开始,可以 ...
- java编译sql存过_SQL SERVER 临时表导致存储过程重编译(recompile)的一些探讨
SQLSERVER为了确保返回正确的值,或者处于性能上的顾虑,有意不重用缓存在内存里的执行计划,而重新编译执行计划的这种行为,被称为重编译(recompile).那么引发存储过程重编译的条件有哪一些呢 ...
最新文章
- STM32 电机教程 32 - 基于ST X-CUBE-SPN7 无刷无感电机库的电机驱动实现
- 第18天学习Java的笔记-ArrayList
- php time相差12小时_PHP服务器时间差8小时解决方案
- Android下EditText中的字体不统一问题
- C# 视频监控系列(14):总结贴——VC++代码转成C#小结
- C#编程语言(六):枚举类型与结构类型
- Android 3D系列之基本概念篇
- html的音频播放,HTML5 音频播放 audio
- BlackArch 创建软件包
- OpenShift 4 - 下载OpenShift项目中的ImageStream
- 爬取网易某只股票2017-01到2018-01的数据
- python常用单词有多少_Python常用单词
- 二十七、单张图片上传预览
- python字典(dictionary)中get和items、iteritems方法
- 浅析移动互联浪潮之由来
- cmd运行sql文件
- APP加壳原理及常用脱壳方法介绍
- 设计模式(一):观察者模式与责任链模式的对比
- 系统架构设计方法论——Zachman
- 火箭双杀尼克斯 哈林组合和砍50分
热门文章
- 如何将bing搜索页面以HTML Mashup的方式嵌入到SAP C4C页面
- SAP C4C Embedded Component里Lead ID和Lead TI页面的关系
- SalesArea F4 help implementation
- Opportunity在Fiori cloud system上编辑之后超时的根源分析
- CRM呼叫中心toolbar的cancel按钮会导致session清理
- SAP Kyma(Extension Factory on SAP Cloud Platform)的架构简介
- SAP CRM事务码COMMPR01无法搜索Individual Object
- 查找窗口隐藏了怎么办_如何快速查找网站管理页面
- ionic2 html 转义,ionic2 基于ngx-translate实现多语言切换,翻译
- python标准库os中用来列出_Python 标准库 os 中用来列出指定文件夹中的文件和子文件夹列表的方式是listdir()。_高职高专数字资源平台答案_学小易找答案...