日期:2014-05-18  浏览次数:20693 次

转换为横排的问题
表1:
类型 货号 类型名称
1 SD1001 A1
2 SD1001 A2
3 SD1001 A3
4 SD1001 A4
5 SD1001 A5
6 SD1001 A6
...             ...             ...

表2:

货号 1 2 3 4 5 6
SD1001 A1 A2 A3 A4 A5 A6
.....................

要求表1变成表2,求SQL语句。我用类试的实现不了

select   b.货号,  
(case   b.类型   when   '1 '   then   'A1 '   end)   as   1,
(case   b.类型   when   '2 '   then   'A2 '   end)   as   2  
 
from   goodbase   b

------解决方案--------------------
参考案例

create table tb(名稱 varchar(10),數量 numeric(10),類型 varchar(5))
Insert into tb
select 'L001 ', '1 ', 'A '
union all select 'L001 ', '2 ', 'B '
union all select 'L002 ', '5 ', 'C '
union all select 'L003 ', '6 ', 'D '
union all select 'L004 ', '9 ', 'A '
union all select 'L004 ', '5 ', 'D '

select * from tb

declare @sql varchar(1000)
set @sql= ' '
select @sql=@sql+ ',[ '+max(類型)+ ']=sum(case 類型 when ' ' '+max(類型)+ ' ' ' then 數量 else 0 end) '
from tb group by 類型
print @sql

exec( 'select 名稱 '+@sql+ ' from tb group by 名稱 ')
--結果
名稱 A B C D
---------------------------------------
L001 1 2 0 0
L002 0 0 5 0
L003 0 0 0 6
L004 9 0 0 5



------解决方案--------------------
select b.货号,
max(case b.类型 when '1 ' then 'A1 ' end) as 1,
max(case b.类型 when '2 ' then 'A2 ' end) as 2

from goodbase b group by b.货号

------解决方案--------------------
你差的就是group by b.货号

------解决方案--------------------
select 货号,min(case when 类型名称= 'A1 ' THEN 'A1 ' END)AS '1 ',
min(case when 类型名称= 'A2 ' THEN 'A2 ' END)AS '2 ',
min(case when 类型名称= 'A3 ' THEN 'A3 ' END)AS '3 ',
min(case when 类型名称= 'A4 ' THEN 'A4 ' END)AS '4 ',
min(case when 类型名称= 'A5 ' THEN 'A5 ' END)AS '5 ',
min(case when 类型名称= 'A6 ' THEN 'A6 ' END)AS '6 '
FROM t
GROUP BY 货号
货号 1 2 3 4 5 6
---------- ---- ---- ---- ---- ---- ----
SD1001 A1 A2 A3 A4 A5 A6

(所影响的行数为 1 行)

警告: 聚合或其它 SET 操作消除了空值。

------解决方案--------------------

CREATE TABLE tb
(
类型 INT,
货号 CHAR(6),
类型名称 CHAR(2)
)
INSERT INTO tb
SELECT 1, 'SD1001 ', 'A1 ' UNION ALL
SELECT 2, 'SD1001 ', 'A2 ' UNION ALL
SELECT 3, 'SD1001 ', 'A3 ' UNION ALL
SELECT 4, 'SD1001 ', 'A4 ' UNION ALL
SELECT 5, 'SD1001 ', 'A5 ' UNION ALL
SELECT 6, 'SD1001 ', 'A6 '
GO
DECLARE @S VARCHAR(500)
SET @S= 'SELECT 货号 '
SELECT @S=@S+ ',MAX(CASE 类型 WHEN '+CAST(类型 AS VARCHAR)+ ' THEN 类型名称 END) AS COL '+CAST(类型 AS VARCHAR) FROM