我有一个连接不同表的SQL select查询。结果类似于下面的第一个表格
p_id | colAprimaryEQsecondary | p_cat | colA | colB | colC
-----|------------------------|-------|------|------|------
001 | 1 | 1 | x | boo1 | flo1
001 | 1 | 2 | x | boo1 | flo1
002 | 0 | 1 | a | boo2 | flo2
002 | 0 | 2 | b | boo2 | flo2
003 | 1 | 1 | z | boo3 | flo3
003 | 1 | 2 | z | boo3 | flo3
p_id
表示数据库的外键列。每个单元格中的每个单元格值都相同,但相应的p_id
s(p_cat
应该是不同的),有时列colA
有2个不同的值。列colAprimaryEQsecondary
包含0
或1
。 1
表示colA
- 值与对应p_id
的行相同。
我想得到这样的结果:
p_id | colAprimaryEQsecondary | p_cat | colA | colB | colC
-----|------------------------|-------|------|------|------
001 | 1 | 2 | x | boo1 | flo1
002 | 0 | 1 | a | boo2 | flo2
002 | 0 | 2 | b | boo2 | flo2
003 | 1 | 2 | z | boo3 | flo3
所以我想创建一个查看colAprimaryEQsecondary
值的SQL查询。如果值等于0
我希望获得两行,如果值等于1
,我只想让p_cat
的行等于2。
我尝试使用不同的方法执行此操作group by
,select distinct
,select distinct on
,case
,但我无法获得正确的选择查询。 (不幸的是我删除了我试过的选择语句。)
我该如何解决这个问题?
答案 0 :(得分:2)
您可以使用WHERE
子句中的简单逻辑执行此操作:
with q as (
<your query here>
)
select
from q
where (colAprimaryEQsecondary = 0) or
(colAprimaryEQsecondary = 1 and p_cat = 2)
答案 1 :(得分:1)
DECLARE @DataSource TABLE
(
[p_id] CHAR(3)
,[colAprimaryEQsecondary] TINYINT
,[p_cat] TINYINT
,[colA] CHAR(1)
,[colB] VARCHAR(8)
,[colC] VARCHAR(8)
);
INSERT INTO @DataSource ([p_id], [colAprimaryEQsecondary], [p_cat], [colA], [colB], [colC])
VALUES ('001', '1', '1', 'x', 'boo1', 'flo1')
,('001', '1', '2', 'x', 'boo1', 'flo1')
,('002', '0', '1', 'a', 'boo2', 'flo2')
,('002', '0', '2', 'b', 'boo2', 'flo2')
,('003', '1', '1', 'z', 'boo3', 'flo3')
,('003', '1', '2', 'z', 'boo3', 'flo3');
SELECT *
FROM @DataSource
WHERE [colAprimaryEQsecondary] = 0
UNION ALL
SELECT [p_id], [colAprimaryEQsecondary], MAX([p_cat]), [colA], [colB], [colC]
FROM @DataSource
WHERE [colAprimaryEQsecondary] = 1
GROUP BY [p_id], [colAprimaryEQsecondary], [colA], [colB], [colC];
答案 2 :(得分:0)
尝试两个不同查询的并集,其中一个where子句使用colAprimaryEQsecondary = 0,另一个使用colAprimaryEQsecondary = 1并且 对于colAprimaryEQsecondary = 1,请对colAprimaryEQsecondary进行计数。