2016-12-23 6 views
1

У меня есть запрос выбора SQL, который объединяет разные таблицы. В результате получается нечто вроде первой таблицы нижеMS SQL Server выбирает уникальные строки на основе значения столбца

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  

Так что я хочу, чтобы создать запрос SQL, который выглядит на значении colAprimaryEQsecondary. Если значение равно 0 Я хочу, чтобы обе строки, если значение равно 1 Я только хочу, чтобы получить строку с p_cat равен 2.

Я пытался делать это с помощью различных методов, group by, select distinct, select distinct on, case, но Я не мог получить правильный запрос выбора. (К сожалению, я удалил выбранные утверждения, которые я пробовал).

Как бы это решить?

ответ

0

Попытка объединение двух различных одного запроса, имеющего где положение с colAprimaryEQsecondary = 0, а другой с colAprimaryEQsecondary = 1 и для colAprimaryEQsecondary = 1 сделать подсчет на colAprimaryEQsecondary.

2

Вы можете сделать это с помощью простой логики в предложении WHERE:

with q as (
     <your query here> 
    ) 
select 
from q 
where (colAprimaryEQsecondary = 0) or 
     (colAprimaryEQsecondary = 1 and p_cat = 2) 
+0

Отлично! Работает отлично. Вопрос, хотя, скажем, те, что создают оригинальные таблицы, были недостаточно осторожны при правильном заполнении «colAprimaryEQsecondary». Есть ли способ внутри запроса select, где я могу проверить 'colA' для различий, а если есть, то также выберите их? Должен ли я сделать это с двумя SQL-запросами внутри третьего предложения 'where'? –

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

Смежные вопросы