abd*_*kok 7 sql-server pivot subquery query-performance
我在TEST表中有以下示例数据:
CREATE TABLE TEST(
f1 varchar(50) NULL,
f2 varchar(50) NULL,
flag int NULL);
INSERT INTO [test]([f1],[f2],[flag]) VALUES('P','a',1);
INSERT INTO [test]([f1],[f2],[flag]) VALUES('P','b',0);
INSERT INTO [test]([f1],[f2],[flag]) VALUES('Q','c',1);
INSERT INTO [test]([f1],[f2],[flag]) VALUES('Q','d',0);
INSERT INTO [test]([f1],[f2],[flag]) VALUES('R','e',1);
INSERT INTO [test]([f1],[f2],[flag]) VALUES('S','f',0);
Run Code Online (Sandbox Code Playgroud)
我想要这个结果:
f1 f2whenFlagIs1 f2whenFlagIs0
P a b
Q c d
R e NULL
S NULL f
Run Code Online (Sandbox Code Playgroud)
已编写以下查询以获得相同的结果:
SELECT isnull(test1.f1,test0.f1) f1, test1.f2 f2whenFlagIs1 , test0.f2 AS f2whenFlagIs0
FROM
(select * from test where flag = 1) AS test1 full JOIN
(select * from test where flag = 0) AS test0
ON test1.f1 = test0.f1
Run Code Online (Sandbox Code Playgroud)
有没有办法避免子查询?
f1给定示例数据,假设+的每种组合只能有一个值,这里有两种方法flag:
SELECT f1,
f2WhenFlagIs1 = MAX(CASE WHEN flag = 1 THEN f2 END),
f2WhenFlagIs0 = MAX(CASE WHEN flag = 0 THEN f2 END)
FROM dbo.TEST
GROUP BY f1;
Run Code Online (Sandbox Code Playgroud)
或者
SELECT f1, f2WhenFlagIs1 = [1], f2WhenFlagIs0 = [0]
FROM dbo.TEST AS t
PIVOT (MAX(f2) FOR flag IN ([0],[1])) AS p;
Run Code Online (Sandbox Code Playgroud)
f1如果任何给定的,对可以有多个值flag,则需要更好地定义所需的结果。
| 归档时间: |
|
| 查看次数: |
132 次 |
| 最近记录: |