使用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,这是一个快速的改变。