2015-06-24 13 views
6

Ist es möglich, zusätzliche Zeilen zu einem ausgewählten Satz basierend auf einem Feldwert hinzuzufügen?sql Hinzufügen von zusätzlichen Zeilen zu jeder Zeile

Ich habe diese Anfrage:

WITH CTEDivisions AS 
(
    SELECT .... 
) 

SELECT 
    cnt, 
    Division 
FROM CTEDivisions 

Welche zurück:

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

Was ich brauche, ist eine Aussage, die drei zusätzliche Zeilen zurückgibt, wenn cnt = 2, wie:

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 habe nach Möglichkeiten gesucht, dies zu tun, und einige mögliche Lösungen mit einemgefundenund WHILE Schleife, aber diese scheinen nicht in Verbindung mit der CTE Anweisung zu arbeiten.

Antwort

4

eine Tabelle für zusätzliche Zeilen Stellen (entweder als CTE oder als permanente Tabelle) und links kommen, um es mit Ihrem Zustand (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 
; 

Ergebnis gesetzt

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

Schön, danke! – russds

+0

Gern geschehen. Antwort von @Giorgi Nakeuri produziert fast identische Ausführungspläne. "OUTER APPLY" funktioniert in diesem Fall wie "LEFT JOIN". –

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

Obwohl ich dieses nicht versucht habe, sieht es gut aus, danke! – russds

Verwandte Themen