2011-05-16 86 views
0

使用SQL Server 2008(R2)帮助!无法获得结果所需

我有一个结果集,我需要以不同的方式显示,这是目前这样的:

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 

我已经看过转动,但不能为我的生命得到它的工作,我不知道支点是什么,我需要。所有的帮助将感激地收到。

回答

1

对于给定和输出,您根本不需要PIVOT。简单的UNIONGROUP BY就足够了。

测试数据

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' 

SQL语句

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 

编辑
虽然UNIONGROUP BY满足的结果,我开始怀疑你是更需要像这样的东西在WITH声明返回Start-EndDate之间每天的记录。

;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 
+0

那17日不会给2xRope125A吗? – 2011-05-16 08:51:46

+0

@Damien - 是的。你是否复制粘贴脚本并得到不同的结果?第二版的 – 2011-05-16 08:58:16

+1

+1。第一个版本确实给出了这个样本数据的正确结果,但这是因为第17行的Rope125A对第三行计数了两次。一次用于StartDate,一次用于EndDate,不是因为重叠。 – 2011-05-16 09:17:01