【问题标题】:How to Pivot/Unpivot Something with SQL2000如何使用 SQL2000 透视/取消透视某些内容
【发布时间】:2011-05-11 16:49:02
【问题描述】:

我正在查询一个基本上是一堆日期的表。

FRECDCUST              DTRECDCUST              DTINSPECTED             DTRECDCUSTPO           DTADDEDSO                 DTSHIPPEDSUP                  DTQUOTEDCUST
1/1/1900 12:00:00 AM    7/27/2010 12:00:00 AM   7/30/2010 12:00:00 AM   7/26/2010 12:00:00 AM   8/6/2010 12:00:00 AM    1/1/1900 12:00:00 AM    8/6/2010 12:00:00 AM
1/1/1900 12:00:00 AM    7/27/2010 12:00:00 AM   7/30/2010 12:00:00 AM   7/26/2010 12:00:00 AM   8/6/2010 12:00:00 AM    1/1/1900 12:00:00 AM    1/1/1900 12:00:00 AM
1/1/1900 12:00:00 AM    1/1/1900 12:00:00 AM    1/1/1900 12:00:00 AM    1/1/1900 12:00:00 AM    1/1/1900 12:00:00 AM    1/1/1900 12:00:00 AM    1/1/1900 12:00:00 AM
1/1/1900 12:00:00 AM    1/1/1900 12:00:00 AM    1/1/1900 12:00:00 AM    1/1/1900 12:00:00 AM    1/1/1900 12:00:00 AM    1/1/1900 12:00:00 AM    1/1/1900 12:00:00 AM
1/1/1900 12:00:00 AM    1/1/1900 12:00:00 AM    1/1/1900 12:00:00 AM    1/1/1900 12:00:00 AM    1/1/1900 12:00:00 AM    1/1/1900 12:00:00 AM    1/1/1900 12:00:00 AM
1/1/1900 12:00:00 AM    3/12/2010 12:00:00 AM   3/15/2010 12:00:00 AM   3/11/2010 12:00:00 AM   3/16/2010 12:00:00 AM   3/24/2010 12:00:00 AM   4/13/2010 12:00:00 AM
1/1/1900 12:00:00 AM    11/6/2009 12:00:00 AM   11/6/2009 12:00:00 AM   11/3/2009 12:00:00 AM   11/9/2009 12:00:00 AM   11/20/2009 12:00:00 AM  12/7/2009 12:00:00 AM

我正在计算每行两个日期之间的日期差。例如,检查的天数是这样找到的:

SELECT (CASE
          WHEN year(SYC_ext.DTRECDCUST) <> 1900
               AND year(SYC_ext.DTINSPECTED) <> 1900
          THEN
            DATEDIFF(dd, SYC_ext.DTRECDCUST, SYC_ext.DTINSPECTED)
          ELSE
            NULL
        END)
         AS [AverageDaystoInspect]
Blah blah...

这会创建一行不同的 DateDiff 计算,最终看起来像这样:

Product Class   Average Days to Inspect Average Days to Process SO  Average Days to Ship to Affiliate   Average Days to Quote   Average Days to Receive Ammended PO
01  2   4   8   27  21
01  2   4   8   27  21
01  3   5   2   88  8
01  3   5   2   88  8
01  1   8   11  72  1
01  3   2   7   27  0
01  5   2   7   27  0

请原谅间距问题。

因此,数据集中的每一行都以一个代表产品类别的数字开头,在本例中为 01,然后是一系列日期计算。

我可以对这些值进行平均,并为每个产品类别的每个类别提供一个平均值。但是,他们希望在表格或矩阵的左侧进行日计算,产品类别在顶部,这与我在这里的完全相反。如果我在 Excel 中旋转它们,我会得到以下信息:

                          01    05     10
Avg Days to Inspect       5      3      5
Avg Days to Process PO    4      5      5
Avg Days to Ship          20     18     19

我希望这是有道理的。知道如何在 SSRS 或 t-sql 中执行此操作吗?

【问题讨论】:

标签: sql-server tsql sql-server-2000 ssrs-2008


【解决方案1】:

假设您可以将第一个查询中的数据加载到中间临时表中,这将完成:

DECLARE @t TABLE
    (
      ProductClass INT
    , InspectDays INT
    , ProcessDays INT
    , ShipDays INT
    )

INSERT  INTO @t
        SELECT  1
              , 2
              , 4
              , 8
        UNION ALL
        SELECT  1
              , 4
              , 5
              , 2
        UNION ALL
        SELECT  5
              , 2
              , 4
              , 8
        UNION ALL
        SELECT  10
              , 3
              , 5
              , 2

SELECT  'Avg Inspect'
      , [01] = AVG(CASE WHEN ProductClass = 1 THEN InspectDays
                   END)
      , [05] = AVG(CASE WHEN ProductClass = 5 THEN InspectDays
                   END)
      , [10] = AVG(CASE WHEN ProductClass = 10 THEN InspectDays
                   END)
FROM    @t
UNION ALL
SELECT  'Avg Process'
      , [01] = AVG(CASE WHEN ProductClass = 1 THEN ProcessDays
                   END)
      , [05] = AVG(CASE WHEN ProductClass = 5 THEN ProcessDays
                   END)
      , [10] = AVG(CASE WHEN ProductClass = 10 THEN ProcessDays
                   END)
FROM    @t

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-20
    • 2013-10-04
    • 2021-11-19
    • 1970-01-01
    • 2019-03-19
    相关资源
    最近更新 更多