2017-10-07 46 views
0

SQL - 转行我想实现以下几列

考虑:

Name | Color | Value | 
------------------------ 
John | Red | 2 | 
------------------------ 
John | Blue | 5 | 
------------------------ 
John | Yellow | 10 | 
------------------------ 

预计:

Name | Red | Blue | Yellow | 
---------------------------------- 
John | 2 | 5 | 10 | 
---------------------------------- 

本质上讲,我希望做的是使颜色将各个列的列值作为行值。有一个catch虽然,你只能使用下面的SQL函数:

聚集

AVG(),COUNT(),MAX(),MIN(),SUM(),ROUND()

算术运算符

  • (加), - (减法),/(除),%(模),*(乘)

比较运算符

=(等于),>(大于),<(小于),> =(大于或等于),< =(小于或等于),<>(不等于),!=(不等于),! <(不低于)!>(不大于)

逻辑运算符

而且,OR,NOT之间,在一样,任何,所有,一些已存在

函数

Case,Cast,Convert,Current_timestamp,DateAdd,DateDiff,DateName,DatePart,GetDate(),IsDate,Left,Len,Lower,Ltrim,Replace,Replicate,Reverse,Right,Rtrim,Space,Str,子字符串,SUBSTRING(表达式,开始,长度),Sysdatetime, Upper

我已经能够得到它显示颜色作为列标题并返回它的值。然而返回此导致额外的颜色值,太像这样:

Name | Red | 
---------------- 
John | 2 | 
---------------- 
John |   | 
---------------- 
John |   | 
---------------- 

我知道,因为我添加颜色名称的附加列的其他颜色值占用其他行。我使用的公式如下:

CASE Color WHEN 'Red' THEN Value END 

我知道我错过了一个约束,但我不知道我在想什么。任何帮助,将不胜感激。

回答

4

如果我明白,你只是错过了有条件的聚集和集团通过

Select Name 
     ,Red = sum(case when Color='Red' then Value end) 
     ,Blue = sum(case when Color='Blue' then Value end) 
     ,Yellow= sum(case when Color='Yellow' then Value end) 
From YourTable 
Group By Name 

返回

Name Red Blue Yellow 
John 2 5  10 
+0

嘿,约翰,谢谢你的答复。该答案不起作用,但我无法访问选择和分组选项。我只能访问我在原始问题 – NSaid

+2

@NSaid中提供的功能。 。 。你指定你可以使用'sum()',所以我没有看到'group by'的问题。 –

+0

@GordonLinoff我没有权限访问Group。只针对原始问题中列出的功能 – NSaid

1

怎么样 “相关子查询”?

SELECT ot.NAME, 
(SELECT SUM(t1.RED) FROM xTable as t1 where t1.NAME = ot.NAME) as RED, 
(SELECT SUM(t1.BLUE) FROM xTable as t1 where t1.NAME = ot.NAME) as BLUE, 
(SELECT SUM(t1.YELLOW) FROM xTable as t1 where t1.NAME = ot.NAME) as YELLOW 
FROM xTable as ot 
1

最新更新。如果2012+,也许你可以使用窗口功能。

没有GROUP BY,但有一个DISTINCT

Select Distinct 
     Name 
     ,Red = sum(case when Color='Red' then Value end) over (Partition By Name) 
     ,Blue = sum(case when Color='Blue' then Value end) over (Partition By Name) 
     ,Yellow= sum(case when Color='Yellow' then Value end) over (Partition By Name) 
From @YourTable