SQL Server - 为此目的的正确查询是什么?

时间:2015-05-19 20:04:58

标签: sql-server sql-server-2008

我有一个包含的表,例如:

ID        CVG
4         A
4         C
5         B

每行包含给定ID的coverage。如果ID没有覆盖范围,则表中将没有行(例如,ID 4没有覆盖范围B)。

从这张表中我想写一个像

这样的查询
SELECT ID, A = case (when ??? then 'TRUE'  when ??? then 'FALSE'), B = case (...), C = case (...) FROM TABLE

将提供输出

ID       A       B        C
4        TRUE    FALSE    TRUE
5        FALSE   TRUE     FALSE

每个ID只有一行,每个coverage只有一列。

对此有什么可行的查询?我不允许更改服务器上的任何永久表,所以我试图用我所拥有的解决方案。

3 个答案:

答案 0 :(得分:1)

您可以使用条件聚合来获取所需的结果:

SELECT ID, 
       CASE 
          WHEN COUNT(CASE WHEN CVG = 'A' THEN 1 END)>=1 THEN 'TRUE'
          ELSE 'FALSE'
       END AS A,
       CASE 
          WHEN COUNT(CASE WHEN CVG = 'B' THEN 1 END)>=1 THEN 'TRUE'
          ELSE 'FALSE'
       END AS B,
       CASE 
          WHEN COUNT(CASE WHEN CVG = 'C' THEN 1 END)>=1 THEN 'TRUE'
          ELSE 'FALSE'
       END AS C,
       .... etc
FROM mytable
GROUP BY ID

SQL Fiddle Demo

答案 1 :(得分:0)

如果你想让它选择

A = case (when ??? then 'TRUE'  when ??? then 'FALSE'), B = case (...), C = case (...)

这是我从你的言论中得到的,你需要做的是

SELECT id, A, B, C FROM TABLE WHERE A = case (when ??? then 'TRUE'  when ??? then 'FALSE'), B = case (...), C = case (...)

答案 2 :(得分:0)

你可以这样做:

select
  ID,
  max(case when CVG = 'A' then 'TRUE' else 'FALSE' end),
  max(case when CVG = 'B' then 'TRUE' else 'FALSE' end),
  max(case when CVG = 'C' then 'TRUE' else 'FALSE' end),
from
  table
group by
  ID

如果为该ID找到一行,则大小写+ max将选择true,否则为false。