2017-08-13 59 views
0

考虑:SQL移动一排是列 - PIVOT查询

+-----------+---------------+-------------+-------+ 
| 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 | 
+----------+---------------+--------+---------+ 

回答

3

尝试1或2个查询:http://sqlfiddle.com/#!6/bb33b/7
第二个给你的问题出准确的结果,但我的猜测是,而第一个是你在找什么。

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 | 
0

假设你的描述值只有永远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 
0

要改变你的数据,你需要的形式,你可以这样做:

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 
0

您可以使用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 | 
+-----------+---------------+-------+--------+ 

可以使用此作为一个替代的解决方案。