Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.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_Sql Server_Tsql - Fatal编程技术网

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