我有一个查询返回类似于下面的结果集
A | B | C | D
-----|----|----|-----
1 abc | d0 | e0 | true
2 def | d0 | e1 | true
3 ghi | d0 | e2 | true
4 jkl | d1 | e1 | true
5 mno | d2 | e2 | false
在 A 列中,每个值都是唯一的。但 B、C、D 列有一些重复值。 我想要 A 列的所有值,但 B、C、D 列的不同值。
预期的结果是这样的
A | B | C | D
-----|---- |---- |-----
1 abc | d0 | e0 | true
2 def | NULL| e1 | NULL
3 ghi | NULL| NULL| NULL
4 jkl | d1 | NULL| NULL
5 mno | d2 | e2 | false
唯一的限制是,我想在单个选择语句中实现这一点。没有嵌套的 Select 语句。
最佳答案
试试这个:
DECLARE @YourTable table (A char(3), B char(2), C char(2), D varchar(5))
INSERT INTO @YourTable VALUES ('abc','d0','e0','true')
INSERT INTO @YourTable VALUES ('def','d0','e1','true')
INSERT INTO @YourTable VALUES ('ghi','d0','e2','true')
INSERT INTO @YourTable VALUES ('jkl','d1','e1','true')
INSERT INTO @YourTable VALUES ('mno','d2','e2','false')
SELECT
A
,CASE WHEN ROW_NUMBER() OVER(PARTITION BY B ORDER BY A,B)=1 THEN B ELSE NULL END AS B
,CASE WHEN ROW_NUMBER() OVER(PARTITION BY C ORDER BY A,C)=1 THEN C ELSE NULL END AS C
,CASE WHEN ROW_NUMBER() OVER(PARTITION BY D ORDER BY A,D)=1 THEN D ELSE NULL END AS D
FROM @YourTable
ORDER BY A,B,C,D
输出:
A B C D
---- ---- ---- -----
abc d0 e0 true
def NULL e1 NULL
ghi NULL e2 NULL
jkl d1 NULL NULL
mno d2 NULL false
(5 row(s) affected)
关于sql - 如何从列中获取不同的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1399199/