【问题标题】:SQL Moving a Row to be a column - PIVOT query [duplicate]SQL将行移动为列-PIVOT查询[重复]
【发布时间】:2018-01-21 07:07:13
【问题描述】:

给定:

+-----------+---------------+-------------+-------+
|   Name    |   Location    | Description | Value |
+-----------+---------------+-------------+-------+
| Company A | Houston       | Sales       |   100 |
| Company A | Houston       | Profit      |    50 |
| Company B | San Francisco | Sales       |   500 |
| Company B | San Francisco | Profit      |   200 |
| Company C | New York      | Sales       |   200 |
| Company C | San Francisco | Profit      |   150 |
+-----------+---------------+-------------+-------+

如何使用 SQL 将其转换为:

+----------+---------------+--------+---------+
|   Name   |   Location    | Sales  | Profit  |
+----------+---------------+--------+---------+
| CompanyA | Houston       |    100 |      50 |
| CompanyB | San Francisco |    500 |     200 |
| CompanyC | New York      |    200 |     150 |
+----------+---------------+--------+---------+

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    您可以使用 PIVOT 函数将行值转换为列,但是它会提供稍微不同但更合理的输出 -

    SELECT Name, Location, Sales, Profit
    FROM
    (
        SELECT *
        FROM Table1
    ) AS SourceTable
    PIVOT
    (
      MIN(value)
      FOR Description IN (Sales, Profit)
    ) AS PivotTable
    ORDER BY Name, Location;
    

    将生成以下输出 -

    +-----------+---------------+-------+--------+
    | Name      | Location      | Sales | Profit |
    +-----------+---------------+-------+--------+
    | Company A | Houston       | 100   | 50     |
    +-----------+---------------+-------+--------+
    | Company B | San Francisco | 500   | 200    |
    +-----------+---------------+-------+--------+
    | Company C | New York      | 200   | null   |
    +-----------+---------------+-------+--------+
    | Company C | San Francisco | null  | 150    |
    +-----------+---------------+-------+--------+
    

    您可以将其用作替代解决方案。

    【讨论】:

      【解决方案2】:

      尝试 1 或 2 查询:http://sqlfiddle.com/#!6/bb33b/7
      第二个给出了您问题中显示的确切结果,但我的猜测是第一个是您正在寻找的。​​p>

      SELECT Name, Location,
             Sum( Case Description when 'Sales' Then Value else 0 end ) Sales,
             Sum( Case Description when 'Profit' Then Value else 0 end ) Profit
      FROM table1
      GROUP BY Name, Location
      Order by 1,2
      ;
      
      |      Name |      Location | Sales | Profit |
      |-----------|---------------|-------|--------|
      | Company A |       Houston |   100 |     50 |
      | Company B | San Francisco |   500 |    200 |
      | Company C |      New York |   200 |      0 |
      | Company C | San Francisco |     0 |    150 |
      

      SELECT Name, Min( Location ) As Location,
             Sum( Case Description when 'Sales' Then Value else 0 end ) Sales,
             Sum( Case Description when 'Profit' Then Value else 0 end ) Profit
      FROM table1
      GROUP BY Name
      Order by 1,2
      ;
      ;
      
      |      Name |      Location | Sales | Profit |
      |-----------|---------------|-------|--------|
      | Company A |       Houston |   100 |     50 |
      | Company B | San Francisco |   500 |    200 |
      | Company C |      New York |   200 |    150 |
      

      【讨论】:

        【解决方案3】:

        要将您的数据转换为您想要的形式,您可以这样做:

         SELECT NAME
                  ,LOCATION
                  ,SUM (CASE WHEN DESCRIPTION = 'Sales' THEN Values ELSE 0 END) AS SALES
                  ,SUM (CASE WHEN DESCRIPTION = 'Profit' THEN Values ELSE 0 END) AS PROFIT
         FROM yourtable
         GROUP BY NAME
                       ,LOCATION
        

        【讨论】:

          【解决方案4】:

          假设您的描述值只有SalesProfit,这是一个 CTE 解决方案。我调用了初始表Before

          with cteSales as (select name, value from Before where description = 'Sales')
          , cteProfit as (select name, value from Before where description  = 'Profit')
          select 
          distinct 
              name
              , location
              , (select value from cteSales where name = B.name) as Sales
              , (select value from cteProfit where name = B.name) as Profit
          from Before B
          

          【讨论】:

            猜你喜欢
            • 2012-06-03
            • 2021-11-25
            • 1970-01-01
            • 1970-01-01
            • 2012-05-11
            相关资源
            最近更新 更多