SQL Aggregate在不同的字段上执行CASE

时间:2014-08-20 14:38:24

标签: sql sql-server

我的数据如下:

SampleID  Result  Qualifier
A1          2      NULL
A1          1      NULL
B2          4      NULL
B2          5       >

我想汇总(求和)结果,但要保留“最保守”的限定符。在这种情况下,'>'比'NULL'

更保守

换句话说,这就是我想要的输出。

SampleID  SumResult  Qualifier
A1           3         NULL
B2           9          >

这可能吗?起初我以为我可以使用Case语句,但在线阅读表明不可能在多个记录中使用它们。

请注意,只有少数可能的'资格赛'。

SELECT [SampleID] ,SUM([Result]) AS [SumResult] --,CASE WHEN (One or more [qualifier] are '>', return '>', else return NULL) AS [Qualifier] FROM [tblData] GROUP BY [Sample ID]

2 个答案:

答案 0 :(得分:1)

您可以使用MAX

SELECT 
      [SampleID]
      ,SUM([Result]) AS [SumResult]
      CASE MAX(CASE Qualifier
      WHEN '*' THEN 1   WHEN 'ND' THEN 2   WHEN '>' THEN 3 END)
      WHEN 1 THEN '*'   WHEN 2 THEN 'ND'   WHEN 3 THEN '>' END as Qualifier
FROM [tblData]
GROUP BY
      [Sample ID]

当然,如果限定符实际上将您所需的排序顺序作为字符串,则您不需要使用CASE表达式转换为整数或从整数转换为直接应用MAX(或MIN)。


对于少数限定符,您只需将此映射存储为整数/从整数存储为另一个表中的两列,并使用该映射而不是CASE表达式。

答案 1 :(得分:0)

对于你想要的,max()应该做到这一点:

SELECT [Sample ID], SUM([Result]) AS [SumResult], MAX(Qualifier) as Qualifier
FROM [tblData]
GROUP BY [Sample ID];