2014-10-27 42 views
2

我有一个包含一个表:SQL结果

EXTDEP EXTCODE PRICE 
200  10001 200 
500  10001 25 
600  10001 36 

结果我想:

EXTCODE PRICE200 PRICE500 PRICE600 
10001 200  25   36 

结果我得到:

EXTCODE PRICE200 PRICE500 PRICE600 
10001 NULL  NULL  36 
10001 NULL  25  NULL 
10001 200  NULL  NULL 

我的代码:

SELECT 
     [ExtCode] 

     case when extdep = '200' then price1 end as '200', 
     case when extdep = '500' then price1 end AS '500', 
     case when extdep = '600' then price1 end AS '600' 

有什么建议吗? :)

回答

5

试试这个,一个总量适用于CASE语句:

SELECT 
     [ExtCode], 

     MAX(case when extdep = '200' then price1 end) as '200', 
     MAX(case when extdep = '500' then price1 end) AS '500', 
     MAX(case when extdep = '600' then price1 end) AS '600' 
FROM your_table 
GROUP BY ExtCode 
+0

谢谢!像魅力一样 – user2893780 2014-10-27 13:10:06

+0

在每种情况下都应该有一个“else 0”,这样你就不会得到“警告:空值被集合或其他SET操作消除”。警告? – 2014-10-27 13:13:57

+0

不,你得到的警告是来自你用作客户端的任何东西,但不是来自MySQL本身。忽略它。你不想以非法的方式改变你的数据。 – fancyPants 2014-10-27 13:16:29

2

下面是一个使用PIVOT一种替代方法

SELECT * 
FROM [table] 
    PIVOT (MAX(PRICE) FOR EXTDEP IN ([200], [500], [600])) T 

这将生成以下输出

EXTCODE  200   500   600 
----------- ----------- ----------- ----------- 
10001  200   25   36 
+0

那么这给了我一样的输出,就像我的查询 – user2893780 2014-10-27 13:31:36

3

你可以使用PIVOT功能也是这样的:

SELECT [ExtCode], 
    [1] AS '200', 
    [2] AS'500', 
    [3] AS'600' 
FROM 
(
     Select [ExtCode], extdep, price1 
     From your_table 
) src 
PIVOT 
    ( 
     Max(price1) 
     For extdep in ([1], [2], [3]) 
) piv 
+0

请通过点击答案左侧的检查来接受@fancyPants答案。这样其他人知道问题已经解决。 – 2014-10-27 13:23:38

+0

+1我不是一个SQL Server的家伙。忘了它:) – fancyPants 2014-10-27 13:23:51