2015-12-30 42 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) 

这是代码大纲,因此需要进行适当的测试和调整。