2016-12-23 3 views
1

Ich habe eine SQL-Select-Abfrage, die verschiedene Tabellen verbindet. Das Ergebnis ist so etwas wie die erste Tabelle untenMS SQL Server wählen eindeutige Zeilen basierend auf Spaltenwert

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 stellt die Fremdschlüsselspalte der Datenbank. Jeder Zellenwert ist innerhalb jeder Zeile derselbe, mit entsprechenden p_id s (p_cat soll anders sein), außer manchmal Spalte colA hat 2 verschiedene Werte. Spalte colAprimaryEQsecondary enthält eine 0 oder 1. 1 Bedeutung der colA -Wert ist der gleiche in Zeilen mit entsprechenden p_id.

Ich möchte ein Ergebnis wie dieses erhalten:

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  

Deshalb möchte ich eine SQL-Abfrage erstellen, die auf dem Wert von colAprimaryEQsecondary aussieht. Wenn der Wert 0 gleich will ich beide Zeilen erhalten, wenn der Wert 1 gleich Ich will nur die Zeile erhalten mit p_cat gleich 2

Ich habe versucht, diese mit verschiedenen Methoden zu tun, group by, select distinct, select distinct on, case, aber Ich konnte die richtige Auswahlabfrage nicht erhalten. (Leider habe ich die ausgewählten Anweisungen gelöscht).

Wie würde ich das lösen?

Antwort

0

eine Vereinigung von zwei verschiedenen Abfrage einer Versuchen mit colAprimaryEQsecondary = 0 und die andere auf colAprimaryEQsecondary mit colAprimaryEQsecondary = 1 und für colAprimaryEQsecondary = 1 tun eine Zählung eine where-Klausel haben.

2

Sie können dies mit einfacher Logik in der WHERE Klausel:

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

Great! Funktioniert gut. Eine Frage, sagen wir mal, diejenigen, die die ursprünglichen Tabellen erstellen, waren nicht vorsichtig genug, um "colAprimaryEQsecondary" richtig zu füllen. Gibt es auch einen Weg innerhalb der Select-Abfrage, wo ich 'colA' auf Unterschiede überprüfen kann, und wenn ja, dann wähle auch diese aus? Soll ich das mit 2 SQL Abfragen innerhalb einer dritten 'where' Klausel machen? –

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

Verwandte Themen