【问题标题】:ANSI SQL to convert lines in columnsANSI SQL 转换列中的行
【发布时间】:2017-01-18 01:19:08
【问题描述】:

我正在尝试根据以下数据转换列中的行:

Select EvolutionOrder, Age from Product where ProductID = 1 

EvolutionOrder Age
-------------- ----
             1 0012
             2 1324
             3 2536
             4 3700

Select EvolutionOrder, Age from Product where ProductID = 2 

EvolutionOrder Age
-------------- ----
             1 QUEE
             1 HIVE

我需要结果为:

Product Age1 Age2 Age3 Age4 Age5
------- ---- ---- ---- ---- ----
      1 0012 1324 2536 3700 NULL
      2 QUEE HIVE NULL NULL NULL

我尝试使用 PIVOT,但没有成功,因为年龄列的聚合函数随值消失

SELECT ProductID,
    [1] AS Age1,
    [2] AS Age2,
    [3] AS age3,
    [4] AS age4
FROM Product
PIVOT (MAX(Age) FOR EvolutionOrder IN ([1], [2], [3], [4])) piv;

我明白了:

ProductID Age1 Age2 age3 age4
--------- ---- ---- ---- ----
1         0012 1324 2536 3700
2         QUEE NULL NULL NULL  --> HIVE Vanished

我得到的另一种方法是运行下面的查询:

with vFX1 as (Select Age Age1 from Product  
                where ProductID = 1 and EvolutionOrder = 1)
   , vFX2 as (Select Age Age2 from Product  
                where ProductID = 1 and EvolutionOrder = 2)
   , vFX3 as (Select Age Age3 from Product  
                where ProductID = 1 and EvolutionOrder = 3)
   , vFX4 as (Select Age Age4 from Product  
                where ProductID = 1 and EvolutionOrder = 4)
   , vFX5 as (Select Age Age5 from Product  
                where ProductID = 1 and EvolutionOrder = 5)
select * from vFX1 Left outer Join vFX2 on 1=1
                   Left outer Join vFX3 on 1=1
                   Left outer Join vFX4 on 1=1
                   Left outer Join vFX5 on 1=1

我不喜欢这个解决方案,因为我需要在同一张表上运行很多次,并且还要清除数据。

我怎么能只用一个 ANSI sql 最智能的查询来做到这一点?

下面是创建数据的脚本:

Create table Product
(ProductID      Int
,EvolutionOrder Int
,Age            Char(4))

Insert into Product values (1,1,'0012');
Insert into Product values (1,2,'1324');
Insert into Product values (1,3,'2536');
Insert into Product values (1,4,'3700');
Insert into Product values (2,1,'QUEE');
Insert into Product values (2,1,'HIVE');

谢谢

注意:因得到帮助而更新

【问题讨论】:

  • 感谢@PawelDyl 和@techspider 的即时响应。我真的没有意识到对字符串使用 MAX 或 MIN 组函数。很棒的提示...不幸的是,当我使用组函数时,我可以正常工作有进化层次的动物..但是当我没有进化层次时,它就行不通了。为 Bee 插入记录: 插入产品值 (2,1,'QUEE') 插入产品值 (2,1,'HIVE') 运行查询.. ProductID Age1 Age2 age3 age4 --------- ---- ---- ---- ---- 1 0012 1324 2536 3700 2 QUEE NULL NULL NULL --> HIVE 消失
  • 注意:由于@PawelDyl 和@techspider 的帮助,我更新了文本,希望文本更清晰

标签: mysql sql sql-server oracle ansi


【解决方案1】:

没有正确选择列是一个问题。您绝对可以在 CHARVARCHAR 列上使用聚合。

CREATE TABLE Product (
    ProductID int,
    EvolutionOrder int,
    Age char(4)
)

INSERT INTO Product
    VALUES (1, 1, '0012');
INSERT INTO Product
    VALUES (1, 2, '1324');
INSERT INTO Product
    VALUES (1, 3, '2536');
INSERT INTO Product
    VALUES (1, 4, '3700');

SELECT
    ProductID,
    [1] AS Age1,
    [2] AS Age2,
    [3] AS age3,
    [4] AS age4
FROM Product
PIVOT (MAX(Age) FOR EvolutionOrder IN ([1], [2], [3], [4])) piv;

DROP TABLE Product

【讨论】:

  • 谢谢你们的即时回复。我真的没有意识到对字符串使用 MAX 或 MIN 组函数。很棒的提示...不幸的是,当我有动物时,组函数可以正常工作进化层次结构..当我没有进化层次结构时,它就行不通。将 Bee 记录插入产品值 (2,1,'QUEE') 插入产品值 (2,1,'HIVE') 运行查询 ProductID Age1 Age2 age3 age4 --------- --- - ---- ---- ---- 1 0012 1324 2536 3700 2 QUEE NULL NULL NULL --> HIVE 消失
【解决方案2】:

语法略有不同,看一下:

Select [1] Age1, [2] Age2, [3] Age3, [4] Age4, [5] Age5
from Product
PIVOT (MAX(Age) for EvolutionOrder in ([1],[2],[3],[4],[5])) P

不要害怕聚合。如果只有一个值,则 MIN 或 MAX 将等于该值。

【讨论】:

    猜你喜欢
    • 2015-01-19
    • 1970-01-01
    • 2016-09-18
    • 2016-11-25
    • 2021-11-15
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    • 2018-05-18
    相关资源
    最近更新 更多