【问题标题】:Transpose SQL table results using Pivot使用 Pivot 转置 SQL 表结果
【发布时间】:2016-12-09 16:22:56
【问题描述】:

我正在尝试将表中的列结果转换为行结果。这是生成表结果的查询:

 CREATE TABLE Zone 
        ([Zone] varchar(9), [CompanyID] int, [SubCount] int);

    CREATE TABLE Company
         ([UniqueIdentifier]int, [Name] varchar(50));

    --Adding Values into the table

    INSERT INTO Company 
        ([UniqueIdentifier], [Name])
    VALUES
        ( 1, 'CompanyA'),
        ( 2, 'CompanyB'),
        ( 3, 'CompanyC'),
        ( 4, 'CompanyD'),
        ( 5, 'CompanyE');

    --Adding Values to the table

    INSERT INTO Zone
        ([Zone], [CompanyID], [SubCount])
    VALUES
        ( 'Zone1', 1, 100),
        ( 'Zone2', 1, 200),
        ( 'Zone3', 2, 1250),
        ( 'Zone4', 3, 1440),
        ( 'Zone5', 4, 1445),
        ( 'Zone6', 4, 3250),
        ( 'Zone7', 5, 4440);

    --Getting TOTALS

    SELECT
    CASE WHEN GROUPING(dbo.Company.Name)=1 THEN 'Grand Total' else  dbo.Company.Name end as Company,
    SUM(dbo.Zone.SubCount) as Subs 

    FROM dbo.Company INNER JOIN dbo.Zone ON dbo.Company.UniqueIdentifier = dbo.Zone.CompanyID 

    WHERE (dbo.Zone.SubCount IS NOT NULL) AND (dbo.Zone.SubCount > 0)

    Group by ROLLUP(dbo.Company.Name)

    ORDER BY Subs DESC;

这里是查询的结果:

    Company     | Subs
------------------------
1   Grand Total | 12125
2   CompanyD    | 4695
3   CompanyE    | 4440
4   CompanyC    | 1440
5   CompanyB    | 1250
6   CompanyA    | 300

期望的结果如下:

 Company |CompanyA|CompanyB|CompanyC|CompanyE|CompanyD|Grand Total  
---------------------------------------------------------------------
 Subs    |  300   |  1250  |  1440  |  4440  |  4695  |   12125

非常感谢任何帮助!

【问题讨论】:

  • 让我知道我的解决方案是否适合您

标签: sql pivot transpose


【解决方案1】:

您需要做的就是使用数据透视函数将这些行转换为列

                SELECT 'Subs' AS Company
                    ,[CompanyA]
                    ,[CompanyB]
                    ,[CompanyC]
                    ,[CompanyD]
                    ,[CompanyE]
                    ,[Grand Total]
                FROM (
                    SELECT CASE 
                            WHEN GROUPING(dbo.Company.NAME) = 1
                                THEN 'Grand Total'
                            ELSE dbo.Company.NAME
                            END AS Company
                        ,SUM(dbo.Zone.SubCount) AS Subs
                    FROM dbo.Company
                    INNER JOIN dbo.Zone ON dbo.Company.UNIQUEIDENTIFIER = dbo.Zone.CompanyID
                    WHERE (dbo.Zone.SubCount IS NOT NULL)
                        AND (dbo.Zone.SubCount > 0)
                    GROUP BY ROLLUP(dbo.Company.NAME)
                    ) a
                pivot(max(subs) FOR Company IN (
                            [CompanyA]
                            ,[CompanyB]
                            ,[CompanyC]
                            ,[CompanyD]
                            ,[CompanyE]
                            ,[Grand Total]
                            )) piv;

【讨论】:

  • 如果有机会,能否将其标记为答案。谢谢@TedOdukalets
  • 没问题!再次感谢!
猜你喜欢
  • 1970-01-01
  • 2014-06-18
  • 2017-12-14
  • 2012-06-22
  • 2013-09-16
  • 2019-04-05
  • 1970-01-01
  • 2017-10-24
  • 1970-01-01
相关资源
最近更新 更多