2016-02-23 47 views
0

我有臺這樣的獲得多行從行單元格值

Id Flag1 Flag2  Desc 
-- ----- ------ ----- 
1  1  1  XXX 
2  1  0  YYY 

,我想造成這樣的

Id Flag1 Flag2  Desc 
-- ----- ------ ----- 
1  1  1  XXX 
1  1  1  XXX 
2  1  0  YYY 

其中用於標記每個條目是真的。

如何做到這一點?

+1

不知道我理解的問題...你想通過2項與FLAG 2 = 1相乘? –

+0

您的結果尚不清楚。 –

+0

僅使用2個標誌?只乘以2或更多? – Susilo

回答

0

UPDATE

既然你有16個標誌列,你可以使用一個數字表像這樣以減少總UNION ALL查詢。只需在一行中添加總標誌並將其與Numbers表的row_number進行比較即可。

查詢

;WITH Numbers AS (SELECT 1 rn UNION ALL SELECT 1 rn UNION ALL SELECT 1 rn UNION ALL SELECT 1), 
Numbers1 AS (SELECT ROW_NUMBER()OVER(ORDER BY c1.rn) as rn FROM Numbers c1 CROSS JOIN Numbers c2) 
SELECT Id, Flag1, Flag2, [Desc] FROM flagtable 
INNER JOIN Numbers1 N ON N.rn <= CONVERT(INT,flag1) + CONVERT(INT,flag2) 
ORDER BY Id ASC 

您可以使用UNION ALL。像這樣的東西。

查詢

SELECT Id, Flag1, Flag2, [Desc] FROM flagtable WHERE Flag1 = 1 
UNION ALL 
SELECT Id, Flag1, Flag2, [Desc] FROM flagtable WHERE Flag2 = 1 
ORDER BY Id 

輸出

Id Flag1 Flag2 Desc 
1 1 1 XXX 
1 1 1 XXX 
2 1 0 YYY 
+0

謝謝。它的工作,但假設有大約16個標誌列。我需要檢查他們 –

0
WITH tbl(id,flag1,flag2,cnt,descp,idx) AS 
    (SELECT id, 
    flag1, 
    flag2, 
    CASE 
     WHEN Flag1=1 
     AND Flag2 =1 
     THEN 2 
     ELSE 1 
    END cnt, 
    descp, 
    1 
    FROM test2 
    UNION ALL 
    SELECT a.id, 
    a.flag1, 
    a.flag2, 
    b.cnt, 
    a.descp, 
    b.idx+1 
    FROM test2 a 
    JOIN tbl b 
    ON (a.id  =b.id 
    AND b.idx+1 <= b.cnt) 
) 
SELECT * FROM tbl ORDER BY id 

查詢結果集的

Result set of the query

+1

只是有兩個單獨的'union all'每個都有自己的'WHERE Flag = 1'而不是自己加入會比較簡單 – ughai

+0

看起來像是不會工作,如果flag1和flag2都有0作爲簡單的使用價值 – MNC

+0

對,但我們不知道OP在這種情況下需要什麼。 – ughai

相關問題