在一个表中查找3组数据之间的空值和重复项

时间:2014-03-21 20:52:17

标签: sql sql-server

我的数据库中有一个表,我们的IT上传了计算机名称和它们所在的系统。我们目前正在做的是尝试协调哪个系统缺少哪台计算机,以及重复项所在的位置。

CREATE TABLE test(
    [item] [varchar](max) NOT NULL,
    [system] [varchar](max) NOT NULL
) ON [PRIMARY]

GO

INSERT INTO test
(item, system)
VALUES
('item 1','system 1'),
('item 1','system 1'),
('item 1','system 2'),
('item 1','system 3'),
('item 2','system 2'),
('item 2','system 3'),
('item 3','system 1'),
('item 3','system 2');

我提供了一个SQL小提琴HERE作为示例数据。我想要的输出是THIS

enter image description here

不是100%从这里开始。

编辑:更新了问题:

@MilenPavlov回答了样本数据的完美工作,但在现实世界的情况下,我不知道项目的名称。只有系统是静态的。是否有他的查询的再现没有使用项目的名称?

编辑:找到解决方案,感谢大家的帮助!

SELECT MAX( CASE WHEN system = 'system 1' THEN item END) system1
,MAX( CASE WHEN system = 'system 2' THEN item END) system2
,MAX( CASE WHEN system = 'system 3' THEN item END) system3
FROM test
GROUP BY item

2 个答案:

答案 0 :(得分:2)

与预期输出略有偏差,但仍然看一下(使用数据透视):

select [system 1], [system 2], [system 3]
from
(
SELECT distinct system, item FROM test
  where item = 'item 1'
  ) x
pivot 
(
max(item)
  for system in ([system 1], [system 2], [system 3])
)p
union all
select [system 1], [system 2], [system 3]
from
(
SELECT distinct system, item FROM test
  where item = 'item 2'
  ) x
pivot 
(
max(item)
  for system in ([system 1], [system 2], [system 3])
)p
union all
select [system 1], [system 2], [system 3]
from
(
SELECT distinct system, item FROM test
  where item = 'item 3'
  ) x
pivot 
(
max(item)
  for system in ([system 1], [system 2], [system 3])
)p

演示:http://sqlfiddle.com/#!3/387a57/41

答案 1 :(得分:0)

   select 
   case  when system='system 1' then item
   END ,
   case when system='system 2' then item 
   END ,
   case when system='system 3' then item
   END 
   FROM TEST;
相关问题