使用SQL Server 2008在单个结果中选择多行
我有一张桌子使用SQL Server 2008在单个结果中选择多行,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一张桌子 code type value =================== 100 R 3300 100 B 7900 101 R 6800 100 D 2100 100 C 2300 101 C 1200 当我选择代码=100时,我希望select语句返回下面的结果 code Rvalue Bvalue Dvalue Cvalue ================================
code type value
===================
100 R 3300
100 B 7900
101 R 6800
100 D 2100
100 C 2300
101 C 1200
当我选择代码=100时,我希望select语句返回下面的结果
code Rvalue Bvalue Dvalue Cvalue
==================================
100 3300 7900 2100 2300
我使用内联查询成功地实现了这一点。但我想知道是否有更好的方法
提前感谢。不确定这是否是最好的方法,但它确实有效。使用max()和CASE从一个列创建多个列。Max将始终选择实值而不是空值。如果需要,可以替换0或其他默认值
SELECT code
,max(CASE
WHEN type = 'r'
THEN value
ELSE NULL
END) RValue
,max(CASE
WHEN type = 'b'
THEN value
ELSE NULL
END) BValue
,max(CASE
WHEN type = 'd'
THEN value
ELSE NULL
END) DValue
,max(CASE
WHEN type = 'c'
THEN value
ELSE NULL
END) CValue
FROM mytable
GROUP BY code
您可以使用PIVOT操作符。我自己从来没有真正使用过它,但我认为它会做你想做的事情。不过,我不太确定它是否有那么好 使用枢轴:
SELECT *
FROM
(
<table that gives you current results>
) src
PIVOT
(
MAX(value) --must use an aggregrate function here
FOR type IN('r', 'b', 'd', 'c')
) pvt
选择*
从…起
(
)src
支点
(
MAX(value)——此处必须使用aggregate函数
对于输入('r','b','d','c')
)pvt
这里以前做过:@vkp-不,没有。顺便说一句,ELSE NULL
不是必需的,因为这就是行为。@MartinSmith-true。但我觉得这更具可读性。如果OP想在里面放一个0,这是一个快速的改变。