2014-09-04 65 views
2

我有一個要求,根據查詢中使用的表中兩列的可空性將行拆分爲兩行。將行拆分爲兩個的查詢

Sample Data 
------------------------------------------------------------------------------------------------- 
PrimaryID  SecondaryID  PassedSubject  FailedSubject  PSField  FSField 
------------------------------------------------------------------------------------------------- 
    1    11    ABC    XYZ   PSFldData1 FSFldData1 
    1    12    DEF    NULL   PSFldData2 FSFldData2 
    2    21    NULL    GHI   PSFldData3 FSFldData3 

所以對於我正在尋找一個可能的結果在下面的格式,上面的數據,作爲要求是,如果田「PassedSubject」和「FailedSubject」列不爲空,然後我需要拆分行應該爲包含PassedSubject值的行填充PSField(PassedSubject字段),並且應該爲包含FailedSubject值的行填充FSField。

Sample Result 
------------------------------------------------------------------------------------------------- 
PrimaryID  SecondaryID  PassedSubject  FailedSubject  PSField  FSField 
------------------------------------------------------------------------------------------------- 
    1    11    ABC    NULL   PSFldData1 NULL 
    1    11    NULL    XYZ   NULL   FSFldData1 

我需要僅對「PassedSubject」和「FailedSubject」列的NOT NULL字段拆分行。

+0

你可以提供帶有id(1,12)和(2,21)的樣本結果的其餘部分嗎? – 2014-09-04 11:32:24

+0

@JaugarChang其餘的id(1,12)和(2,21) – Prakazz 2014-09-04 11:50:58

+0

@JaugarChang的結果仍然是一樣的當然我會檢查它! – Prakazz 2014-09-04 15:25:47

回答

0
SELECT PrimaryID, 
     SecondaryID, 
     CR.PassedSubject, 
     CR.FailedSubject, 
     CR.PSField, 
     CR.FSField 
FROM TableName 
CROSS APPLY (VALUES 
    (PassedSubject,NULL,PSField,NULL), 
    (NULL, FailedSubject,NULL,FSField))  
    CR (PassedSubject, FailedSubject, PSField, FSField) 
WHERE TableName.PassedSubject IS NOT NULL AND TableName.FailedSubject IS NOT NULL 
UNION ALL 
SELECT * FROM TableName 
WHERE TableName.PassedSubject IS NULL OR TableName.FailedSubject IS NULL 

SQLFiddle

PRIMARYID SECONDARYID PASSEDSUBJECT FAILEDSUBJECT  PSFIELD  FSFIELD 
     1   11   ABC  (null)  PSFldData1  (null) 
     1   11  (null)   XYZ   (null) FSFldData1 
     1   12   DEF  (null)  PSFldData2 FSFldData2 
     2   21  (null)   GHI  PSFldData3 FSFldData3 
0
;WITH PassedCTE AS 
(
    SELECT PrimaryID, 
      SecondaryID, 
      PassedSubject, 
      NULL AS FailedSubject, 
      PSField, 
      NULL AS FSField 
    FROM TableName 
    WHERE PassedSubject IS NOT NULL 
),FailedCTE AS 
(
    SELECT PrimaryID, 
      SecondaryID, 
      NULL AS PassedSubject, 
      FailedSubject, 
      NULL AS PSField, 
      FSField 
    FROM TableName 
    WHERE FailedSubject IS NOT NULL 
) 
SELECT * 
FROM PassedCTE 
UNION 
SELECT * 
FROM FailedCTE 
+0

謝謝詹尼斯!這是有幫助的! – Prakazz 2014-09-04 10:57:04

0

不知道你的樣品結果符合你想要什麼(沒有上面的行都以兩種被拆分既不具有secondaryId = 11,但無論如何,你想做的事(分割行的細節兩個)可以與UNION可以容易地實現ALL子句,使用不同的標準用於WHERE:

SELECT PrimaryId, SecondaryID, .... 
FROM table 
WHERE <condition for first line to appear> 
UNION ALL 
SELECT PrimaryId, SecondaryID, .... 
FROM table 
WHERE <condition for second line to appear> 

希望這有助於