什么样的SQL查询会产生这些结果?
鉴于这些数据:什么样的SQL查询会产生这些结果?,sql,sql-server-2008,tsql,pivot,Sql,Sql Server 2008,Tsql,Pivot,鉴于这些数据: Name Property Value ---------- ---------- ---------- Bob Hair Red Bob Eyes Blue Fred Hair Brown Fred Height Tall 生成这些结果需要什么SQL Property Bob Fred -------
Name Property Value
---------- ---------- ----------
Bob Hair Red
Bob Eyes Blue
Fred Hair Brown
Fred Height Tall
生成这些结果需要什么SQL
Property Bob Fred
---------- ---------- ----------
Hair Red Brown
Eyes Blue
Height Tall
我使用的是SQL Server 2008,但是一个通用的解决方案会很好。这里是一种老式的方法,当然假设每个(名称、属性)都是唯一的:
SELECT Properties.Property, Bob.Value, Fred.Value
FROM
(
SELECT DISTINCT Property
FROM myTable
) Properties
LEFT OUTER JOIN
(
SELECT Property, Value
FROM myTable
WHERE Name = 'Bob'
) Bob ON Properties.Property = Bob.Property
LEFT OUTER JOIN
(
SELECT Property, Value
FROM myTable
WHERE Name = 'Fred'
) Fred ON Properties.Property = Fred.Property
当然,只有提前知道专栏,你才能这样做。如果不这样做,您可以创建并执行动态SQL,但这并非没有问题
根据您的RDBMS,您可能可以使用pivot查询,这将简化语法(如果您的人数/姓名未知,也可以使用pivot查询)这是一种老式的方法,当然假设每个(名称、属性)都是唯一的:
SELECT Properties.Property, Bob.Value, Fred.Value
FROM
(
SELECT DISTINCT Property
FROM myTable
) Properties
LEFT OUTER JOIN
(
SELECT Property, Value
FROM myTable
WHERE Name = 'Bob'
) Bob ON Properties.Property = Bob.Property
LEFT OUTER JOIN
(
SELECT Property, Value
FROM myTable
WHERE Name = 'Fred'
) Fred ON Properties.Property = Fred.Property
当然,只有提前知道专栏,你才能这样做。如果不这样做,您可以创建并执行动态SQL,但这并非没有问题
根据您的RDBMS,您可能可以使用pivot查询,这将简化语法(或者如果您的人数/姓名未知,则可以使用该查询)您没有指定正在使用的RDBMS,但这是一个pivot。您可以在所有数据库中使用聚合函数和大小写表达式:
select property,
max(case when name='Bob' then value else '' end) Bob,
max(case when name='Fred' then value else '' end) Fred
from yourtable
group by property
看
如果您使用的数据库具有PIVOT
功能(SQL Server 2005+/Oracle 11g+),则您的代码与此类似:
select *
from
(
select property, name, value
from yourtable
) src
pivot
(
max(value)
for name in (Bob, Fred)
) piv
看
如果您提前知道名称值,则上述查询非常有效,但如果您不知道,则需要使用动态sql:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(name)
from yourtable
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT property,' + @cols + ' from
(
select property, name, value
from yourtable
) x
pivot
(
max(value)
for name in (' + @cols + ')
) p '
execute(@query)
看
这三种方法将产生相同的结果:
| PROPERTY | BOB | FRED |
---------------------------
| Eyes | Blue | |
| Hair | Red | Brown |
| Height | | Tall |
您没有指定正在使用的RDBMS,但这是一个轴心。您可以在所有数据库中使用聚合函数和大小写表达式:
select property,
max(case when name='Bob' then value else '' end) Bob,
max(case when name='Fred' then value else '' end) Fred
from yourtable
group by property
看
如果您使用的数据库具有PIVOT
功能(SQL Server 2005+/Oracle 11g+),则您的代码与此类似:
select *
from
(
select property, name, value
from yourtable
) src
pivot
(
max(value)
for name in (Bob, Fred)
) piv
看
如果您提前知道名称值,则上述查询非常有效,但如果您不知道,则需要使用动态sql:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(name)
from yourtable
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT property,' + @cols + ' from
(
select property, name, value
from yourtable
) x
pivot
(
max(value)
for name in (' + @cols + ')
) p '
execute(@query)
看
这三种方法将产生相同的结果:
| PROPERTY | BOB | FRED |
---------------------------
| Eyes | Blue | |
| Hair | Red | Brown |
| Height | | Tall |
不是所有DBs都支持的pivot查询。请看一下MSSQL pivot:您正在使用什么rdbms?使用SQL Server 2008,但正在寻找一个通用的答案。看到答案后,我想一般的答案可能不是最好的办法。@JeffRoe你会提前知道名字吗?意思是你会知道不是所有DBs都支持的pivot查询,Bob或Fred。看看MSSQL pivot:你在使用什么rdbms?使用SQL Server 2008,但正在寻找一般答案。看到答案后,我想一般的答案可能不是最好的办法。@JeffRoe你会提前知道名字吗?意思是你会知道鲍勃或弗雷德吗?