2016-03-09 11 views
7

ich die folgende Ausgabe von unten Bild erstellen möchten:T-SQL - Daten erhalten, basierend auf zwei Säulen

sample

Die Eingabedaten aus einer Sicht ist (Select * from test). Das Ziel ist es, alle Daten zu erhalten, wo die progress Spalte den Text tbd enthält und die counter Nummer ist 1.

Kann dies mit Fall bei Anweisung gelöst werden?

Da sqlfiddle nicht, hier zu arbeiten ist das Schema:

CREATE TABLE test 
(
    [ID] [int] NOT NULL, 
    [Counter] [int] NOT NULL, 
    [Name] nvarchar(200) NULL, 
    [Progress] nvarchar(200) NOT NULL 
) 

INSERT INTO test 
VALUES (1, 1, 'userA', 'tbd'), 
     (1, 2, 'userB', 'done'), 
     (1, 3, 'userC', 'tbd'), 
     (2, 1, 'userB', 'done'), 
     (2, 5, 'userA', 'tbd'), 
     (3, 1, 'userD', 'tbd'), 
     (3, 2, 'userA', 'done'), 
     (3, 7, 'userC', 'tbd'), 
     (3, 11, 'userB', 'tbd') 

ich es nicht arbeiten konnte.

Ich hoffe, Sie können mir helfen.

Vielen Dank.

Antwort

2

Exists Klausel verwenden können Sie Ihr gewünschtes Ergebnis erzielen.

Abfrage

SELECT 
    * 
FROM test t 
WHERE EXISTS (SELECT 1 FROM test 
      WHERE t.ID = ID 
      AND progress = 'tbd' 
      AND counter = 1) 

Ergebnis

ID Counter Name Progress 
----------------------------- 
1  1  userA tbd 
1  2  userB done 
1  3  userC tbd 
3  1  userD tbd 
3  2  userA done 
3  7  userC tbd 
3  11 userB tbd 

Und eine weitere alternative Lösung ist einfach SELF JOIN wie this-

Abfrage

SELECT 
    le.ID, le.Counter, le.Name, le.Progress 
    FROM test le 
INNER JOIN test re ON le.ID = re.ID 
WHERE re.progress = 'tbd' 
    AND re.counter = 1 

Die obige Abfrage gibt das gleiche Ergebnis zurück.

+1

warum? eine einfache WHERE ist genug ... – Vland

+0

@Vland: Einfaches 'WHERE' gibt Ihnen nur 2 Zeilen, was nicht die gewünschte Ausgabe von OP ist. Sie können es selbst überprüfen, indem Sie das Skript verwenden, das von OP zur Verfügung gestellt wird. –

+0

ok mein Schlechter. Ich dachte, dass _get alle Daten, in denen die Fortschrittsspalte den Text tbd enthält und die Zählernummer 1_ bedeutete nur 2 Zeilen abrufen! Danke für ihn, er hat einen Screenshot gepostet – Vland

1

einfach versuchen:

select * from test where progress = 'tbd' and counter = 1 
1

Vielleicht wird dies Ihnen helfen:

select *, 
     row_number() over(partition by Progress order by Counter) 
     rowID 
into #tmp 
from Test 

select * 
from #tmp 
where ID in(
      select ID 
      from #tmp 
      where Counter = 1 
        and Progress = 'tbd' 
     ) 
order by ID, 
      rowID 
Verwandte Themen