2015-06-24 11 views
6

Czy można dodać dodatkowe wiersze do wybranego zestawu na podstawie wartości pola?sql dodawanie kolejnych wierszy do każdego wiersza

mam tej kwerendy:

WITH CTEDivisions AS 
(
    SELECT .... 
) 

SELECT 
    cnt, 
    Division 
FROM CTEDivisions 

która zwraca:

cnt   Division 
    1   Sales 
    2   Marketing 
    1   Business 
    2   IT 
    etc... 

Co potrzebne jest stwierdzenie, że zwraca 3 dodatkowe rzędy po cnt = 2, jak:

Division  NewDivision 
Sales  Sales 
Marketing Marketing - X 
Marketing Marketing - Y 
Marketing Marketing - Z 
Business  Business 
IT   IT - X 
IT   IT - Y 
IT   IT - Z 
etc... 

I Szukałem sposobów na zrobienie tego i znalazłem kilka możliwych rozwiązań przy użyciuPętlai WHILE, ale te nie działają w połączeniu z instrukcją CTE.

Odpowiedz

4

Bądź stolik dla dodatkowych wierszy (jako CTE, lub jako stały tabeli) i pozostawiono dołączyć do niego za pomocą warunku (cnt=2):

DECLARE @T TABLE(cnt int, Division varchar(100)); 
INSERT INTO @T(cnt, Division) VALUES 
(1, 'Sales'), 
(2, 'Marketing'), 
(1, 'Business'), 
(2, 'IT'); 

WITH 
CTEDivisions 
AS 
(
    SELECT 
     cnt 
     ,Division 
    FROM @T 
) 
,CTE_Extra 
AS 
(
    SELECT ' - X' AS Extra 
    UNION ALL 
    SELECT ' - Y' AS Extra 
    UNION ALL 
    SELECT ' - Z' AS Extra 
) 
SELECT 
    cnt 
    ,Division 
    ,Division + ISNULL(Extra, '') AS NewDivision 
FROM 
    CTEDivisions 
    LEFT JOIN CTE_Extra ON CTEDivisions.cnt = 2 
; 

zestaw wyników

cnt Division NewDivision 
1  Sales  Sales 
2  Marketing Marketing - X 
2  Marketing Marketing - Y 
2  Marketing Marketing - Z 
1  Business Business 
2  IT   IT - X 
2  IT   IT - Y 
2  IT   IT - Z 
+0

Piękna, dziękuję! – russds

+0

Nie ma za co. Odpowiedz przez @Giorgi Nakeuri produkuje prawie identyczny plan wykonania. "ZEWNĘTRZNE ZASTOSOWANIE" w tym przypadku działa jak "LEWE DOŁĄCZ". –

4
WITH CTEDivisions AS 
(
    SELECT .... 
) 

SELECT 
    c.cnt, 
    c.Division, 
    c.Division + ISNULL(' - ' + o.v, '') AS NewDivision 
FROM CTEDivisions c 
OUTER APPLY(SELECT v FROM(VALUES('X'),('Y'),('Z'))t(v) WHERE c.cnt = 2)o 
+0

Chociaż nie wypróbowałem tego, wygląda dobrze, dziękuję! – russds