我有一个返回类似于下面的结果集的查询
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
唯一的限制是,我想在Single select语句中实现这一点。没有嵌套的Select语句。
答案 0 :(得分:3)
试试这个:
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)
答案 1 :(得分:1)
SELECT A,
CASE
WHEN EXISTS
(
SELECT NULL
FROM mytable mi
WHERE mi.id < mo.id
AND mi.b = mo.b
) THEN NULL
ELSE B
END AS B,
CASE
WHEN EXISTS
(
SELECT NULL
FROM mytable mi
WHERE mi.id < mo.id
AND mi.c = mo.c
) THEN NULL
ELSE c
END AS c,
CASE
WHEN EXISTS
(
SELECT NULL
FROM mytable mi
WHERE mi.id < mo.id
AND mi.d = mo.d
) THEN NULL
ELSE d
END AS d
FROM mytable mo
答案 2 :(得分:0)
您需要的是实际上违反sql的本质。在sql中,结果不依赖于排序。
即使你找到了获得这样结果的方法(例如Quassnoi提供的),我也会避免在SQL中这样做。