T-SQL在另一列的条件/数据上的一列中显示数据

时间:2013-08-30 01:51:10

标签: sql sql-server tsql pivot

在另一列的条件/数据上的一列中显示数据

我希望从行中选择数据并将其显示在依赖的列中 关于相邻列中的数据。

示例:

这是我的数据:

ID            STATUS      VALUE
XYZ            1          7.50
XYZ            2          65.00
XYZ            3          795.00
ABC            1          15.60
ABC            3          563.50
ABC            2          79.00
DEF            3          597.00
DEF            1          23.00
DEF            2          89.60

我要找的结果是:

(1 = ValueA,2 = ValueB,3 = ValueC)

ID            VALUEA      VALUEB      VALUEC
XYZ            7.50        65.00      795.00
ABC            15.60       79.00      563.50
DEF            23.00       89.60      597.00

我在此网站上发现了处理类似问题的条目,但不太适合这种情况。是否有一个简单的查询可以产生所需的结果?

3 个答案:

答案 0 :(得分:2)

您应该能够使用带有CASE表达式的聚合函数来获得结果:

select id,
  max(case when status = 1 then value end) ValueA,
  max(case when status = 2 then value end) ValueB,
  max(case when status = 3 then value end) ValueC
from yourtable
group by id;

SQL Fiddle with Demo。 CASE表达式将检查每个status,然后选择相关的最大值。将数据从行转换为列称为PIVOT。

您还可以使用PIVOT函数获取结果:

select id,
  [1] ValueA,
  [2] ValueB,
  [3] ValueC
from yourtable
pivot
(
  max(value)
  for status in ([1], [2], [3])
) piv;

SQL Fiddle with Demo

最后,您还可以多次在桌面上加入以返回结果:

select a.id,
  a.value ValueA,
  b.value ValueB,
  c.value ValueC
from yourtable a
left join yourtable b
  on a.id = b.id
  and b.status = 2
left join yourtable c
  on a.id = c.id
  and c.status = 3
where a.status = 1;

请参阅SQL Fiddle with Demo

答案 1 :(得分:1)

您正在寻找数据透视。一种方法是使用条件max()聚合:

SELECT  id ,
    MAX(CASE WHEN status = 1 THEN Value
        END) AS ValueA ,
    MAX(CASE WHEN status = 2 THEN Value
        END) AS ValueB ,
    MAX(CASE WHEN status = 3 THEN Value
        END) AS ValueC
FROM    t
GROUP BY id;

答案 2 :(得分:0)

您似乎在寻找PIVOT声明。