Sql 帮助无法获得所需的结果
使用SQLServer2008R2 我有一个需要以不同方式显示的结果集,它当前可用,如:Sql 帮助无法获得所需的结果,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,使用SQLServer2008R2 我有一个需要以不同方式显示的结果集,它当前可用,如: Resource Nr Cost StartDate EndDate Cable_5m 8 3.5 12/03/2011 13/03/2011 Cable_5m 2 3.5 13/03/2011 14/03/2011 Rope125A 1 0 16/03/2011 18/03/2011 Rope125A 1 0 17/0
Resource Nr Cost StartDate EndDate
Cable_5m 8 3.5 12/03/2011 13/03/2011
Cable_5m 2 3.5 13/03/2011 14/03/2011
Rope125A 1 0 16/03/2011 18/03/2011
Rope125A 1 0 17/03/2011 17/03/2011
我需要的是按日期报告每个资源的发送数量,如下所示:
DateOfEvnt Resource Nr Cost
2011-03-12 Cable_5m 8 3.50
2011-03-13 Cable_5m 10 3.50
2011-03-14 Cable_5m 2 3.50
2011-03-16 Rope125A 1 0.00
2011-03-17 Rope125A 2 0.00
2011-03-18 Rope125A 1 0.00
我已经看过pivot,但我一生都无法让它发挥作用,我也不确定pivot是否是我所需要的。我们将非常感谢您的帮助。对于给定的输入和输出,您根本不需要轴心。简单的联合和分组就足够了 测试数据 SQL语句 编辑 当UNION和GROUP BY满足结果时,我开始怀疑您更需要这样的东西,WITH语句在开始日期和结束日期之间每天返回一条记录
这不会在17号出现,对吗?@Damien-是的,会的。你复制粘贴的脚本,并有不同的结果吗?+1为第二个版本。第一个版本确实给出了此示例数据的正确结果,但这是因为第17行的Rope125A对第三行计数两次。一次是开始日期,一次是结束日期,这并不是因为重叠。感谢列文,但是在一个更大的数据集上,fugures似乎偏离了一些真相。请尝试以下数据集资源NrSent ItemCost SubEvntStart SubEVENT 1615 10 0.25 07/02/2011 22/03/2011 1615 4 0.25 01/03/2011 08/04 1615 2 0.25 07/03/2011 01/04 1615 10 0.25 14/03/2011 21/03/2011 1615 0.25 15/03/2011 21/03/2011 1615 5 0.25 15/03/2011 22/03/20111615 4 0.25 18/03/2011 19/03/2011 1615 4 0.25 18/03/2011 19/03/2011
DECLARE @Resources TABLE (
Resource VARCHAR(32)
, Nr INTEGER
, Cost FLOAT
, StartDate DATE
, EndDate DATE
)
INSERT INTO @Resources
SELECT 'Cable_5m', 8, 3.5, '03/12/2011', '03/13/2011'
UNION ALL SELECT 'Cable_5m', 2, 3.5, '03/13/2011', '03/14/2011'
UNION ALL SELECT 'Rope125A', 1, 0, '03/16/2011', '03/18/2011'
UNION ALL SELECT 'Rope125A', 1, 0, '03/17/2011', '03/17/2011'
SELECT DateOfEvnt
, Resource
, Nr = SUM(Nr)
, Cost
FROM (
SELECT Resource
, Nr
, Cost
, [DateOfEvnt] = StartDate
FROM @Resources
UNION ALL
SELECT Resource
, Nr
, Cost
, [DateOfEvnt] = EndDate
FROM @Resources
) r
GROUP BY
Resource
, Cost
, DateOfEvnt
;WITH q AS (
SELECT Resource
, Nr
, Cost
, StartDate
, DateOfEvnt = StartDate
FROM @Resources
UNION ALL
SELECT q.Resource
, q.Nr
, q.Cost
, q.StartDate
, DATEADD(day, 1, q.DateOfEvnt)
FROM q
INNER JOIN @Resources s ON s.Resource = q.Resource
AND s.Nr = q.Nr
AND s.StartDate = q.StartDate
WHERE q.DateOfEvnt < s.EndDate
)
SELECT DateOfEvnt
, Resource
, Nr = SUM(Nr)
, Cost
FROM q
GROUP BY
DateOfEvnt
, Resource
, Cost