【问题标题】:SQL query to transfer values from rows to columns for subselect groupsSQL查询将值从行传输到子选择组的列
【发布时间】:2011-08-17 11:39:57
【问题描述】:

问题来了:

数据集是:

Col1        Col2  
BK.01.04    A0103  
BK.01.04    A0306  
BK.01.04    A0309  
BK.01.04    A0403  
BK.02.01    A1403  
BK.02.02    A1403  
BK.02.03    A0403  
BK.02.03    A0703  
BK.02.04    A0103  
BK.02.04    A0306  
BK.02.04    A0309  
BK.02.04    A0403 

要求的结果是:

Col1        Col2    Col3    Col4    Col5  
BK.01.04    A0103   A0306   A0309   A0403  
BK.02.01    A1403  
BK.02.02    A1403  
BK.02.04    A0103   A0306   A0309   A0403  

关于如何在 MS Access/Plain SQL 中执行此操作的任何想法?非常感谢任何帮助:)

【问题讨论】:

  • 我想这必须是一个动态解决方案,因为数据可能会发生变化,而且您不能保证每个 Col1 值可能具有的记录数?

标签: sql ms-access


【解决方案1】:

将表连接回自身:

select
    t1.col1,
    t1.col2,
    t2.col2 as col3,
    t3.col2 as col4,
    t4.col2 as col5
from mytable t1
left join mytable t2 on t2.col1 = t1.col1 and t2.col2 > t1.col2
left join mytable t3 on t3.col1 = t1.col1 and t3.col2 > t2.col2 and t2.col2 is not null
left join mytable t4 on t4.col1 = t1.col1 and t4.col2 > t3.col2 and t3.col2 is not null
order by 1;

使用left join 意味着当连接表中没有匹配的行时,您将得到空白。连接条件中的所有废话都是为了确保每列中有不同的升序值

【讨论】:

    【解决方案2】:

    不完全是你想要的,但我认为你会发现用你想要的值填充最左边的列很有挑战性......

    使用 ANSI-SQL 的数据透视表:

    CREATE TABLE DataSet ( Col1 varchar(20), Col2 varchar(20))
    
    INSERT INTO DataSet ( Col1, Col2 ) VALUES ( 'BK.01.04','A0103')
    INSERT INTO DataSet ( Col1, Col2 ) VALUES ( 'BK.01.04','A0306')
    INSERT INTO DataSet ( Col1, Col2 ) VALUES ( 'BK.01.04','A0309')
    INSERT INTO DataSet ( Col1, Col2 ) VALUES ( 'BK.01.04','A0403')
    INSERT INTO DataSet ( Col1, Col2 ) VALUES ( 'BK.02.01','A1403')
    INSERT INTO DataSet ( Col1, Col2 ) VALUES ( 'BK.02.02','A1403')
    INSERT INTO DataSet ( Col1, Col2 ) VALUES ( 'BK.02.03','A0403')
    INSERT INTO DataSet ( Col1, Col2 ) VALUES ( 'BK.02.03','A0703')
    INSERT INTO DataSet ( Col1, Col2 ) VALUES ( 'BK.02.04','A0103')
    INSERT INTO DataSet ( Col1, Col2 ) VALUES ( 'BK.02.04','A0306')
    INSERT INTO DataSet ( Col1, Col2 ) VALUES ( 'BK.02.04','A0309')
    INSERT INTO DataSet ( Col1, Col2 ) VALUES ( 'BK.02.04','A0403')
    
    SELECT Col1,
    MAX(CASE Col2 WHEN 'A0103' THEN 'A0103' ELSE '' END) Col2,
    MAX(CASE Col2 WHEN 'A0306' THEN 'A0306' ELSE '' END) Col3,
    MAX(CASE Col2 WHEN 'A0309' THEN 'A0309' ELSE '' END) Col4,
    MAX(CASE Col2 WHEN 'A0403' THEN 'A0403' ELSE '' END) Col5,
    MAX(CASE Col2 WHEN 'A1403' THEN 'A1403' ELSE '' END) Col6
    FROM DataSet 
    GROUP BY DataSet.Col1
    

    结果是:

    Col1                 Col2  Col3  Col4  Col5  Col6
    -------------------- ----- ----- ----- ----- -----
    BK.01.04             A0103 A0306 A0309 A0403 
    BK.02.01                                     A1403
    BK.02.02                                     A1403
    BK.02.03                               A0403 
    BK.02.04             A0103 A0306 A0309 A0403 
    
    (5 row(s) affected)
    

    如果您使用的是 MS-Access,则可以通过使用数据透视表来完成同样的事情:

    http://office.microsoft.com/en-us/access-help/designing-your-first-pivottable-pivotchart-views-in-access-HA001034580.aspx

    【讨论】:

    • 不确定,但可能这在 MS Access 中不起作用(因为我认为那里不支持 CASE)。
    • 如果您使用的是 MS Access,您可以使用内置的 Pivot 功能来动态完成同样的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    • 2019-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多