我想以一种非常独特的方式使我的MS SQL 2008选择查询显示结果,我希望有人可以帮助我完成。
我希望数据显示在一行中,并且将3列名称重复9次,而不是将3列的结果显示在9行上。
我尝试谷歌这个,但我似乎无法在任何地方找到正确的想法。
感谢一百万可以提供帮助的人!
我想发布图片,但我需要代表点做这么愚蠢!但无论如何,我发现了一个类似的帖子,为PostgreSQL 8.3提供了答案。但我是一个初学者,所以我不明白如何翻译是为MS SQL。
之前:
col1 | col2 | col3 |
-----|--------|---------|
a |12/01/12| 13/01/12|
-----|--------|---------|
b |14/01/12| 14/01/12|
后:
col1 | col2 | col3 |col1 | col2 | col3 |
-----|--------|---------|-----|--------|---------|
a |12/01/12| 13/01/12| b |14/01/12| 15/01/12|
-----|--------|---------|-----|--------|---------|
这里的链接可以让您更好地了解我的情况 Convert multiple rows into one row with multiple columns
答案 0 :(得分:3)
在SQL Server 2005+中,您可以使用PIVOT
函数执行此操作。 pivot 从行中获取值并将其转换为列。
有几种方法可以转动数据。如果您提前知道所有值,那么您可以对查询进行硬编码。否则,您可以使用动态SQL在运行时生成查询。
pivot 的静态版本与此类似:
select *
from
(
select col1, col2
from table1
) src
pivot
(
max(col1)
for col2 in (test, blah, value)
) piv
如果您有未知数量的值,那么您将生成类似于此的动态SQL:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(col2)
from table1
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT ' + @cols + ' from
(
select col1, col2
from table1
) x
pivot
(
max(col1)
for col2 in (' + @cols + ')
) p '
execute(@query)
这些是从您的表中获取col2
行值并将其转换为列。两者的结果是相同的:
| TEST | BLAH | VALUE |
-----------------------
| 1 | 2 | 3 |
在SQL Server 2005之前或没有 pivot 函数的数据库中,您将使用带有case
表达式的聚合函数来转换数据:
select
max(case when col2 = 'test' then col1 end) test,
max(case when col2 = 'blah' then col1 end) blah,
max(case when col2 = 'value' then col1 end) value
from table1
如果要反复重复列,另一种方法是一起使用UNPIVOT
和PIVOT
函数来获取结果。如果您有样本数据:
CREATE TABLE yourtable
([id] int, [name] varchar(10), [type] varchar(10))
;
INSERT INTO yourtable
([id], [name], [type])
VALUES
(1, 'John', 'dog'),
(2, 'Tim', 'bird'),
(3, 'Betty', 'cat'),
(4, 'Jim', 'rat')
;
您想在重复列中重复id
,name
和type
值,然后您可以使用:
select *
from
(
select
col +'_'+cast(rn as varchar(50)) col ,
value
from
(
select
cast(id as varchar(10)) id,
name,
type,
row_number() over(order by id) rn
from yourtable
) src
unpivot
(
value
for col in (id, name, type)
) unpiv
) src
pivot
(
max(value)
for col in (id_1, name_1, type_1,
id_2, name_2, type_2,
id_3, name_3, type_3,
id_4, name_4, type_4)
) piv
见SQL Fiddle with Demo。结果将是:
| ID_1 | NAME_1 | TYPE_1 | ID_2 | NAME_2 | TYPE_2 | ID_3 | NAME_3 | TYPE_3 | ID_4 | NAME_4 | TYPE_4 |
-----------------------------------------------------------------------------------------------------
| 1 | John | dog | 2 | Tim | bird | 3 | Betty | cat | 4 | Jim | rat |
编辑#2,查看您可以使用以下内容的示例数据:
select *
from
(
select
col +'_'+cast(rn as varchar(50)) col ,
value
from
(
select
col1,
convert(varchar(10), col2, 120) col2,
convert(varchar(10), col3, 120) col3,
row_number() over(order by col1) rn
from yourtable
) src
unpivot
(
value
for col in (col1, col2, col3)
) unpiv
) src
pivot
(
max(value)
for col in (col1_1, col2_1, col3_1,
col1_2, col2_2, col3_2)
) piv
给出结果:
| COL1_1 | COL2_1 | COL3_1 | COL1_2 | COL2_2 | COL3_2 |
-----------------------------------------------------------------------
| a | 2012-01-12 | 2012-01-13 | b | 2012-01-14 | 2012-01-14 |