2015-12-30 27 views
0

分組列數據我想實現以下轉變:有共同的價值,否則顯示默認的文本

樣本數據

SELECT NumWURm,ReportAText,ReportBText,ReportCText,ReportDText,ReportEText,ReportFText 
FROM t_SchFacility 
WHERE FacID IN (483,485) 

結果:

NumWURm ReportAText  ReportBText ReportCText ReportDText ReportEText ReportFText 

3  Report On venue Warm Up  Photo  Get Set  
2  Report On venue Warm Up  Photo   

所需的輸出

我想獲得顯示的常見列值,如果值不同,我想顯示一些默認文本。

NumWURm ReportAText  ReportBText ReportCText ReportDText ReportEText ReportFText 

3  Report On venue Warm Up  Photo  Default Text   
+0

當你說「常用列值」時,你指的是哪些列?更具體地說'NumWURm'的值不同,但是'3'被返回。而'ReportEText'中的區別有你的問題陳述所指出的'默認文本'。那麼,什麼決定了哪個'NumWURm'返回並且在所有其他列上報告差異? –

+0

其他欄目需要報告差異。在numWURm的情況下,我們需要最大值 –

+0

另外,當您說「數值不同」時,是否指「where」謂詞所描述的結果集中的任何值?換句話說,你的例子包含5行而不是2,其中3行有一個空的「ReportDText」,兩行有'Get Set',輸出仍然是單行嗎?有沒有一種情況下輸出將是單行之外的任何東西? –

回答

1

這就是我最喜歡的MIN = MAX技巧。當MIN和MAX相同時,只有一個值,MIN或MAX可用作THE值。

SELECT  
    MAX(NumWURm) as NumWURm, 
    CASE WHEN MIN(ReportAText) = MAX(ReportAText) 
     THEN MIN(ReportAText) 
     ELSE 'Default' 
    END, 
    CASE WHEN MIN(ReportBText) = MAX(ReportBText) 
     THEN MIN(ReportBText) 
     ELSE 'Default' 
    END, 
    CASE WHEN MIN(ReportCText) = MAX(ReportCText) 
     THEN MIN(ReportCText) 
     ELSE 'Default' 
    END, 
    CASE WHEN MIN(ReportDText) = MAX(ReportDText) 
     THEN MIN(ReportDText) 
     ELSE 'Default' 
    END, 
    CASE WHEN MIN(ReportEText) = MAX(ReportEText) 
     THEN MIN(ReportEText) 
     ELSE 'Default' 
    END, 
    CASE WHEN MIN(ReportFText) = MAX(ReportFText) 
     THEN MIN(ReportFText) 
     ELSE 'Default' 
    END 
FROM t_SchFacility 
WHERE FacID IN (483,485) 

如果您需要這是真的具體,您可能需要指定字符串比較的排序選項(例如,如果情況不同的是你顯著)。

0

以下內容將爲非空集合生成單行輸出。

with [Selected] ([NumWURm], [ReportAText], [ReportBText], [ReportCText], [ReportDText], [ReportEText], [ReportFText]) 
(
    select [NumWURm], [ReportAText], [ReportBText], [ReportCText], [ReportDText], [ReportEText], [ReportFText] 
    from [t_SchFacility] 
    where [FacID] IN (483, 485) 
), 
    [Number_Selected] ([count]) 
(
    selected count(*) 
    from [Selected] 
), 
    [ReportAText] ([ReportAText]) 
(
    select s.[ReportAText], n.[count] 
    from [Selected] as s cross join [Number_Selected] as n 
    group by s.[ReportAText], n.[count] 
    having count(*) = n.[count] 
), 
... 
    [ReportFText] ([ReportFText]) 
(
    select s.[ReportFText], n.[count] 
    from [Selected] as s cross join [Number_Selected] as n 
    group by s.[ReportFText], n.[count] 
    having count(*) = n.[count] 
) 
select 
    max(s.[NumWURm]) as 'NumWuRm', 
    a.coalesce([ReportAText], 'Default Text') as 'ReportAText', 
    b.[ReportBText] as 'ReportBText', 
    c.[ReportCText] as 'ReportCText', 
    d.[ReportDText] as 'ReportDText', 
    e.[ReportEText] as 'ReportEText', 
    f.[ReportFText] as 'ReportFText' 
from 
    [Selected] as s 
     left outer join 
    [ReportAText] as a 
     on (null is null) 
     left outer join 
    ... 
    [ReportFText] as f 
     on (null is null) 

這是代碼大綱,因此需要進行適當的測試和調整。