日期合并查询怎么写?

lzp4881 2018-04-19 05:33:19

如图,数据是按月存放的,想查询出如下结果:
费用名称 起始日期 结束日期 月份 单价 数量 金额
物业费 2018-1-1 2018-4-30 4 0.6 88 211.2
停车费 2018-1-1 2018-4-30 4 250 1000

需要注意的是,有些数据的日期不是连续的,比如:

物业费 2018-1-1 2018-1-30 1 0.6
物业费 2018-2-1 2018-2-28 1 0.6
物业费 2018-4-1 2018-4-30 1 0.6
停车费 2018-1-1 2018-1-30 1 250
停车费 2018-2-1 2018-2-28 1 250
停车费 2018-3-1 2018-3-30 1 250
想要查询结果为:
物业费 2018-1-1 2018-2-28 2 0.6 88 105.6
物业费 2018-4-1 2018-4-30 1 0.6 88 52.8
停车费 2018-1-1 2018-3-30 3 250 750
...全文
603 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
lzp4881 2018-04-20
  • 打赏
  • 举报
回复
两个都不错。RINK_1 的更简洁一些。谢谢!
RINK_1 2018-04-19
  • 打赏
  • 举报
回复

select 费用名称,min(开始时间) as 开始时间,max(结束时间) as 结束时间,
COUNT(1) as 月数,MAX(单价) as 单价,MAX(数量),SUM(实收金额) as 实收金额
from
(select *,DATEDIFF(MONTH,'1900-01-01',开始时间) as diff,
ROW_NUMBER() over (partition by 费用名称 order by 开始时间) as seq
from table) as A
group by 费用名称,diff-seq
中国风 2018-04-19
  • 打赏
  • 举报
回复
这样?参照方法 e.g.
use Tempdb
go
--> --> 中国风(Roy)生成測試數據
 
if not object_id(N'Tempdb..#Tab1') is null
	drop table #Tab1
Go
Create table #Tab1(费用名称 nvarchar(23),开始时间 Date,结束时间 Date,单价 INT,数量 int,实收金额 decimal(18,7))
Insert #Tab1
select N'物业费','2018-1-1','2018-1-30',1,88,0.6 union all
select N'物业费','2018-2-1','2018-2-28',1,88,0.6 union all
select N'物业费','2018-4-1','2018-4-30',1,88,0.6 union all
select N'停车费','2018-1-1','2018-1-30',NULL,1,250 union all
select N'停车费','2018-2-1','2018-2-28',NULL,1,250 union all
select N'停车费','2018-3-1','2018-3-30',NULL,1,250
GO
;WITH CTED
AS
(
SELECT *
     , CASE WHEN 开始时间=LAG(DATEADD(mm,1,开始时间),1,开始时间) OVER (PARTITION BY 费用名称 ORDER BY 开始时间) THEN 1 ELSE 0 END AS Flag
	 ,ROW_NUMBER()OVER(PARTITION BY 费用名称 ORDER BY 开始时间) AS RN
FROM #Tab1
)
SELECT 费用名称
     , 单价
     , MIN(开始时间) AS 开始日期
     , MAX(结束时间) AS 结束日期
     , COUNT(*) AS 月份
     , SUM(数量) AS 数量
     , SUM(实收金额) AS 实收金额
FROM
(SELECT *
      , RN-ROW_NUMBER() OVER (PARTITION BY 费用名称, Flag ORDER BY RN) AS Grp
 FROM CTED) AS T
GROUP BY 费用名称
       , 单价
       , T.Grp;

/*
费用名称	单价	开始日期	结束日期	月份	数量	实收金额
停车费	NULL	2018-01-01	2018-03-30	3	3	750.0000000
物业费	1	2018-01-01	2018-02-28	2	176	1.2000000
物业费	1	2018-04-01	2018-04-30	1	88	0.6000000
*/
中国风 2018-04-19
  • 打赏
  • 举报
回复
检查自己的模拟数据,单价与数量格式错位

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧