MS SQL Server根据列值

时间:2016-12-23 13:09:54

标签: sql sql-server tsql

我有一个连接不同表的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包含011表示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 byselect distinctselect distinct oncase,但我无法获得正确的选择查询。 (不幸的是我删除了我试过的选择语句。)

我该如何解决这个问题?

3 个答案:

答案 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];

enter image description here

答案 2 :(得分:0)

尝试两个不同查询的并集,其中一个where子句使用colAprimaryEQsecondary = 0,另一个使用colAprimaryEQsecondary = 1并且 对于colAprimaryEQsecondary = 1,请对colAprimaryEQsecondary进行计数。