1

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

我正在寻找从行中选择数据并将它们显示在依赖于相邻列中的数据的列中。

例子 :

这是我的数据:

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=值A,2=值B,3=值C)

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

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

4

3 回答 3

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

于 2013-08-30T01:54:50.830 回答
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;
于 2013-08-30T01:55:06.877 回答
0

您似乎正在寻找PIVOT声明。

于 2013-08-30T01:56:00.890 回答