Sql 从月粮到日粮
有没有一种方法可以轻松地从一个月的谷物变成一天的谷物?例如,下面是每月谷物表:Sql 从月粮到日粮,sql,sql-server,tsql,Sql,Sql Server,Tsql,有没有一种方法可以轻松地从一个月的谷物变成一天的谷物?例如,下面是每月谷物表: DECLARE @SessionsPerArea TABLE (idSession INT, startDate DATE) INSERT @SessionsPerArea VALUES (1,'2013-01-31'), (2,'2013-02-28'), (3,'2013-03-31') select * from @SessionsPerArea 结果: idSession startDate 1
DECLARE @SessionsPerArea TABLE (idSession INT, startDate DATE)
INSERT @SessionsPerArea VALUES
(1,'2013-01-31'),
(2,'2013-02-28'),
(3,'2013-03-31')
select *
from @SessionsPerArea
结果:
idSession startDate
1 2013-01-01
2 2013-02-01
3 2013-03-01
我希望结果如下:
idSession startDate
1 2013-01-01
1 2013-01-02
1 2013-01-03
.
.
1 2013-01-30
1 2013-01-31
2 2013-02-01
2 2013-02-01
2 2013-02-02
.
.
2 2013-02-27
2 2013-02-28
3 2013-03-01
3 2013-03-02
3 2013-03-03
.
.
3 2013-03-30
3 2013-03-31
我对这个例子进行了测试。它使用CTE创建一个临时结果集,该结果集包含给定idSession和startDate的每月每一天的记录
我从这些其他答案以及我浏览的其他答案中得到了一些帮助
卢克的答复
乔·戴利的回答
如果你使用一个简单有效的方法。下面是一个很好的例子,描述了如何生成它 对于本例,我动态填充它,但在生产中,我有一个包含100K行的永久表。它在许多报告中都很有用
DECLARE @Numbers TABLE (Number int PRIMARY KEY);
INSERT INTO @Numbers (Number)
SELECT TOP(100)
ROW_NUMBER() OVER(ORDER BY sys.all_objects.object_id) AS Number
FROM sys.all_objects;
现在,对于每个会话,我们使用交叉应用返回当月的所有日期。此解决方案返回startDate当天或之前的所有月份天数。如果你的起始日期如你所说是一个月的最后一天,那么每个月的每一天都会有一行
不清楚你想要什么。是否要获取@SessionsPerArea表中的数据,并将其展开,以便每个idSession在startDate所在月份的每一天都有一行?另外,你是否假设startDate总是一个月的第一天,或者你如何知道应该包括哪些日期?@AdamPorad是你的第一个问题。关于你的第二个问题,我做了更新。我假设我每个月的最后一天都有一个会话。换句话说,开始日期总是一个月的最后一天。谢谢你的回复。老实说,我真的很喜欢你的回答和解释,但我更喜欢交叉申请的CTE。这是我选择另一个答案的唯一原因。纽约vse ravno spasibo.:没问题。我猜您的数据集很小,所以性能方面的任何解决方案都可以。
DECLARE @Numbers TABLE (Number int PRIMARY KEY);
INSERT INTO @Numbers (Number)
SELECT TOP(100)
ROW_NUMBER() OVER(ORDER BY sys.all_objects.object_id) AS Number
FROM sys.all_objects;
DECLARE @SessionsPerArea TABLE (idSession INT, startDate DATE)
INSERT @SessionsPerArea VALUES
(1,'2013-01-31'),
(2,'2013-02-28'),
(3,'2013-03-31')
SELECT *
FROM
@SessionsPerArea AS S
CROSS APPLY
(
SELECT DATEADD(day, 1-N.Number, S.startDate) AS NewDate
FROM @Numbers AS N
WHERE N.Number <= DAY(S.startDate)
) AS CA
ORDER BY S.idSession, NewDate;
idSession startDate NewDate
1 2013-01-31 2013-01-01
1 2013-01-31 2013-01-02
1 2013-01-31 2013-01-03
1 2013-01-31 2013-01-04
1 2013-01-31 2013-01-05
1 2013-01-31 2013-01-06
1 2013-01-31 2013-01-07
1 2013-01-31 2013-01-08
1 2013-01-31 2013-01-09
1 2013-01-31 2013-01-10
1 2013-01-31 2013-01-11
1 2013-01-31 2013-01-12
1 2013-01-31 2013-01-13
1 2013-01-31 2013-01-14
1 2013-01-31 2013-01-15
1 2013-01-31 2013-01-16
1 2013-01-31 2013-01-17
1 2013-01-31 2013-01-18
1 2013-01-31 2013-01-19
1 2013-01-31 2013-01-20
1 2013-01-31 2013-01-21
1 2013-01-31 2013-01-22
1 2013-01-31 2013-01-23
1 2013-01-31 2013-01-24
1 2013-01-31 2013-01-25
1 2013-01-31 2013-01-26
1 2013-01-31 2013-01-27
1 2013-01-31 2013-01-28
1 2013-01-31 2013-01-29
1 2013-01-31 2013-01-30
1 2013-01-31 2013-01-31
2 2013-02-28 2013-02-01
2 2013-02-28 2013-02-02
2 2013-02-28 2013-02-03
2 2013-02-28 2013-02-04
2 2013-02-28 2013-02-05
2 2013-02-28 2013-02-06
2 2013-02-28 2013-02-07
2 2013-02-28 2013-02-08
2 2013-02-28 2013-02-09
2 2013-02-28 2013-02-10
2 2013-02-28 2013-02-11
2 2013-02-28 2013-02-12
2 2013-02-28 2013-02-13
2 2013-02-28 2013-02-14
2 2013-02-28 2013-02-15
2 2013-02-28 2013-02-16
2 2013-02-28 2013-02-17
2 2013-02-28 2013-02-18
2 2013-02-28 2013-02-19
2 2013-02-28 2013-02-20
2 2013-02-28 2013-02-21
2 2013-02-28 2013-02-22
2 2013-02-28 2013-02-23
2 2013-02-28 2013-02-24
2 2013-02-28 2013-02-25
2 2013-02-28 2013-02-26
2 2013-02-28 2013-02-27
2 2013-02-28 2013-02-28
3 2013-03-31 2013-03-01
3 2013-03-31 2013-03-02
3 2013-03-31 2013-03-03
3 2013-03-31 2013-03-04
3 2013-03-31 2013-03-05
3 2013-03-31 2013-03-06
3 2013-03-31 2013-03-07
3 2013-03-31 2013-03-08
3 2013-03-31 2013-03-09
3 2013-03-31 2013-03-10
3 2013-03-31 2013-03-11
3 2013-03-31 2013-03-12
3 2013-03-31 2013-03-13
3 2013-03-31 2013-03-14
3 2013-03-31 2013-03-15
3 2013-03-31 2013-03-16
3 2013-03-31 2013-03-17
3 2013-03-31 2013-03-18
3 2013-03-31 2013-03-19
3 2013-03-31 2013-03-20
3 2013-03-31 2013-03-21
3 2013-03-31 2013-03-22
3 2013-03-31 2013-03-23
3 2013-03-31 2013-03-24
3 2013-03-31 2013-03-25
3 2013-03-31 2013-03-26
3 2013-03-31 2013-03-27
3 2013-03-31 2013-03-28
3 2013-03-31 2013-03-29
3 2013-03-31 2013-03-30
3 2013-03-31 2013-03-31