2015-06-24 5 views
6

क्या फ़ील्ड मान के आधार पर किसी चयनित सेट में अतिरिक्त पंक्तियां जोड़ना संभव है?वर्ग प्रत्येक पंक्ति में अतिरिक्त पंक्तियों को जोड़कर

WITH CTEDivisions AS 
(
    SELECT .... 
) 

SELECT 
    cnt, 
    Division 
FROM CTEDivisions 

कौन देता है:

मैं इस प्रश्न हैं

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

क्या मैं जरूरत है एक बयान है कि 3 अतिरिक्त पंक्तियों देता है जब cnt = 2, जैसे:

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... 

मैं इसने करने के तरीकों की खोज की है, औरका उपयोग करके कुछ संभावित समाधान पाए हैंऔर WHILE पाश, लेकिन वे CTE कथन के साथ संयोजन में काम नहीं करते हैं।

उत्तर

4

अपने अतिरिक्त पंक्तियों के लिए एक मेज करें (या तो एक CTE के रूप में, या एक स्थायी तालिका के रूप में) और बाएं अपनी हालत (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 
; 

परिणाम सेट

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

सुंदर, धन्यवाद! – russds

+0

आपका स्वागत है। @Giorgi Nakeuri द्वारा उत्तर लगभग समान निष्पादन योजना उत्पन्न करता है। इस मामले में 'बाहरी आवेदन' 'बाएं जॉइन 'की तरह काम करता है। –

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

हालांकि मैंने इसे आजमाया नहीं है, यह अच्छा लगता है! – russds

संबंधित मुद्दे