2016-03-09 12 views
7

Chcę utworzyć następujący wynik od dołu obrazu:T-SQL - get danych oparte na dwóch kolumnach

Dane

sample

Wejście jest z widokiem (Select * from test). Celem jest uzyskanie wszystkich danych, w których kolumna progress zawiera tekst tbd i numer counter jest 1.

Czy można to rozwiązać za pomocą przypadku, gdy instrukcja?

Od sqlfiddle nie działa oto schemat:

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') 

nie mogę zmusić go do pracy.

Mam nadzieję, że możesz mi pomóc.

Wielkie dzięki.

Odpowiedz

2

Korzystanie Exists klauzulę można osiągnąć pożądany rezultat.

Zapytanie

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

Wynik

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 

I jeszcze Alternatywnym rozwiązaniem jest prosta SELF JOIN jak to-

Query

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 

Powyższe zapytanie zwraca ten sam wynik.

+1

dlaczego? proste GDZIE wystarczy ... – Vland

+0

@Vland: Prosty "GDZIE" daje tylko 2 wiersze, które nie są pożądanymi wynikami operacyjnymi. Możesz to sprawdzić samodzielnie, używając skryptu dostarczonego przez OP. –

+0

ok mój zły. Myślałem, że _get wszystkie dane, w których kolumna postępu zawiera tekst tbd, a numer licznika to 1_ oznacza pobieranie tylko 2 wierszy! dzięki dla niego opublikował zrzut ekranu – Vland

1

Wystarczy spróbować:

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

Może to pomoże:

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 
Powiązane problemy