SQL查询将值从行传输到列以进行子选择组

时间:2011-08-17 11:39:57

标签: sql ms-access

问题在于:

数据集是:

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中执行此操作的任何想法?非常感谢任何帮助:)

2 个答案:

答案 0 :(得分:0)

将表格加入自身:

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表示当连接表中没有匹配的行时,您将获得空白。连接条件中的所有废话都是为了确保每列中有不同的升序值

答案 1 :(得分:0)

并不完全符合您的要求,但我认为您最难将最左边的列填充为您想要的值...

使用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