使用 Pivot 转置 SQL table 结果

Transpose SQL table results using Pivot

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

 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

非常感谢任何帮助!

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

                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;