【问题标题】:Query that pivots multiple columns旋转多列的查询
【发布时间】:2017-06-15 20:33:51
【问题描述】:

我有一个生成所需输出的查询,但布局不正确。我需要将一些列作为一个组进行旋转,但不知道该怎么做。

查询如下:

SELECT Line.DocumentName
      ,Package.PackageName
      ,Package.ContainerCount
      ,Package.PageCount
      ,m.Name Media
  FROM Invoice i
    JOIN Section s ON i.InvoiceDate = s.InvoiceDate
    JOIN Line l ON s.InvoiceDate = l.InvoiceDate AND s.DocumentTypeID = l.DocumentTypeID
    JOIN Package p ON l.InvoiceDate = p.InvoiceDate AND l.DocumentTypeID = p.DocumentTypeID AND l.DocumentDate = p.DocumentDate
    JOIN MediaType m ON p.MediaTypeID = m.Id
  WHERE i.InvoiceDate = '6/1/2017';

这会返回:

|varchar(100)        |char(2)    |int           |int      |varchar(10)|
|--------------------|-----------|--------------|---------|-----------|
|DocumentName        |PackageName|ContainerCount|PageCount|Media      |
|--------------------|-----------|--------------|---------|-----------|
|Invoices17_05_26.xml|01         |          1758|     2024|A          |
|Invoices17_05_26.xml|30         |           382|     1728|Email      |
|Invoices17_05_30.xml|01         |          2757|     3336|A          |
|Invoices17_05_30.xml|30         |           626|     2101|Email      |
|Credits17_05_01.xml |01         |          1346|     1488|A          |
|Credits17_05_01.xml |30         |           390|      451|Email      |
|Credits17_05_08.xml |01         |             0|        0|C          |
|Credits17_05_08.xml |30         |           353|      408|Email      |
|Stmts-17_05_01.xml  |01         |         14796|    15299|B          |
|Stmts-17_05_01.xml  |30         |          2888|     3267|Email      |

但是,我需要输出具有这种布局:

|DocumentName        |01 ContainerCount|01 PageCount|01 Media|30 ContainerCount|30 PageCount|30 Media|
|--------------------|-----------------|------------|--------|-----------------|------------|--------|
|Invoices17_05_26.xml|             1758|        2024|A       |              382|        1728|Email   |
|Invoices17_05_30.xml|             2757|        3336|A       |              626|        2101|Email   |
|Credits17_05_01.xml |             1346|        1488|A       |              390|         451|Email   |
|Credits17_05_08.xml |                0|           0|C       |              353|         408|Email   |
|Stmts-17_05_01.xml  |            14796|       15299|B       |             2888|        3267|Email   |

我尝试了以下变体,但无济于事:

【问题讨论】:

    标签: sql-server sql-server-2008-r2 pivot


    【解决方案1】:

    我不清楚您是否需要动态(即多个 PackageName)

    也许最简单的方法是将您的初始查询包装在一个最终的条件聚合中

    示例

    Select DocumentName
          ,[01 ContainerCount] = sum(case when PackageName='01' then ContainerCount end)
          ,[01 PageCount]      = sum(case when PackageName='01' then PageCount end)
          ,[01 Media]          = max(case when PackageName='01' then Media end)
          ,[30 ContainerCount] = sum(case when PackageName='30' then ContainerCount end)
          ,[30 PageCount]      = sum(case when PackageName='30' then PageCount end)
          ,[30 Media]          = max(case when PackageName='30' then Media end)
     From  (
            SELECT Line.DocumentName
                  ,Package.PackageName
                  ,Package.ContainerCount
                  ,Package.PageCount
                  ,m.Name Media
              FROM Invoice i
                JOIN Section s ON i.InvoiceDate = s.InvoiceDate
                JOIN Line l ON s.InvoiceDate = l.InvoiceDate AND s.DocumentTypeID = l.DocumentTypeID
                JOIN Package p ON l.InvoiceDate = p.InvoiceDate AND l.DocumentTypeID = p.DocumentTypeID AND l.DocumentDate = p.DocumentDate
                JOIN MediaType m ON p.MediaTypeID = m.Id
              WHERE i.InvoiceDate = '6/1/2017'
           ) A
     Group By DocumentName
    

    退货

    【讨论】:

      【解决方案2】:

      试试这个...
      它旋转多列,但不是动态的

      SELECT 
      DocumentName
      , [01 ContainerCount] = SUM([P1CC1])
      , [01 PageCount] = SUM([P1PC1])
      , [01 Media] = MAX([P1M1])
      , [30 ContainerCount] = SUM([P30CC2])
      , [30 PageCount] = SUM([P30PC2])
      , [30 Media] = MAX([P30M2])
      FROM (
      
      SELECT 
          A.DocumentName AS DocumentName, 
          ContainerCount,
          [PageCount], 
          Media
          ,A.PackageName + 'CC' + CAST(DENSE_RANK() OVER (PARTITION BY A.DocumentName ORDER BY A.PackageName ASC) AS NVARCHAR) AS [PkgNumberCC]
          ,A.PackageName + 'PC' + CAST(DENSE_RANK() OVER (PARTITION BY A.DocumentName ORDER BY A.PackageName ASC) AS NVARCHAR) AS [PkgNumberPC]
          ,A.PackageName + 'M' + CAST(DENSE_RANK() OVER (PARTITION BY A.DocumentName ORDER BY A.PackageName ASC) AS NVARCHAR) AS [PkgNumberM]
          FROM (
              SELECT Line.DocumentName
                    ,Package.PackageName
                    ,Package.ContainerCount
                    ,Package.PageCount
                    ,m.Name Media
                FROM Invoice i
                  JOIN Section s ON i.InvoiceDate = s.InvoiceDate
                  JOIN Line l ON s.InvoiceDate = l.InvoiceDate AND s.DocumentTypeID = l.DocumentTypeID
                  JOIN Package p ON l.InvoiceDate = p.InvoiceDate AND l.DocumentTypeID = p.DocumentTypeID AND l.DocumentDate = p.DocumentDate
                  JOIN MediaType m ON p.MediaTypeID = m.Id
                WHERE i.InvoiceDate = '6/1/2017'
          ) A
      ) AS query
      PIVOT (MAX(ContainerCount)
            FOR [PkgNumberCC] IN ([P1CC1],[P30CC2])) AS Pivot1
      PIVOT (MAX([PageCount])
            FOR [PkgNumberPC] IN ([P1PC1],[P30PC2])) AS Pivot2
      PIVOT (MAX(Media)
            FOR [PkgNumberM] IN ([P1M1],[P30M2])) AS Pivot3
      GROUP BY
        DocumentName
      ORDER BY DocumentName
      

      【讨论】:

        猜你喜欢
        • 2022-01-23
        • 2019-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多