Sql 帮助无法获得所需的结果

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

使用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/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