【问题标题】:Selecting one row based on the values in a group根据组中的值选择一行
【发布时间】:2017-11-14 01:14:39
【问题描述】:

这里是 SQL 编码新手。我的数据如下所示:

Case          Allegation          Result
1             1                   Supported
1             2                   Not Supported
2             1                   Not Supported
3             1                   Not Supported
3             2                   Supported
3             3                   Not Supported
4             1                   Not Supported
4             2                   Supported

就我而言,如果案件中的任何指控得到支持,则该案件被视为“支持”。我需要做的是每个唯一案例返回一行,如果满足该条件,则显示“支持”,否则显示“不支持”:

Case          Result
1             Supported
2             Not Supported
3             Supported
4             Supported

在过去,我会“过度选择”我需要的内容并通过 Reporting Services 表达式完成显示工作,但这次我提供的是查询。我想我需要一个带有组的子选择,但不知道如何做。

【问题讨论】:

  • 你有tried anything so far吗? :)
  • 提示。按案例使用分组并返回最大值(结果)
  • 只需使用SELECT DISTINCT Case FROM AllegationsTable WHERE Result='Supported'
  • @ibo 如果没有 Supported,你可以返回 Not Supported
  • @maSTAShuFu 没看懂,有WHERE Result='Supported'怎么返回不支持?

标签: sql group-by subquery


【解决方案1】:
SELECT DISTINCT a.[case], 
            CASE 
              WHEN c.result IS NULL THEN 'Not Supported' 
              ELSE 'Supported' 
            END AS result 
FROM   t AS a 
   LEFT JOIN (SELECT b.[case], 
                     b.result 
              FROM   t AS b 
              WHERE  b.result = 'Supported') AS c 
          ON a.[case] = c.[case]; 

结果:

case    result
1   Supported
2   Not Supported
3   Supported
4   Supported

你可以在这里看到它:

http://sqlfiddle.com/#!6/9c217/47

【讨论】:

  • 谢谢,我认为这可能很简单。我确实只需要选择不同的,然后将指控表加入到支持的指控上,然后选择一个案例语句,将所有没有支持状态的案例标记为不支持。
  • 我不确定您的表中是否有 ID 列,但在所有表中都有它是一个很好的做法。如果您有,那么获得相同的结果会容易得多
  • @DStein 不要忘记始终选择正确的答案或投票给人们(答案或 cmets)。这就是成员通过努力获得学分的方式
  • @lbo 当然,我认为我的选票还没有被计算在内,但我已经对我所学习的每个人都投了赞成票。希望能在知识方面达到我也可以向前支付的程度。
  • @DStein 我看不到任何投票。答案旁边有一个复选标记,您应该选择一个作为正确答案,您也可以投票。演员立即可见
【解决方案2】:

有点像

Select 
   t.[case], 
   case when existSupported.case is not null then “Supported” else “Not Supported”
 From table1 t
    Left join (select distinct [case] from table1 where result = ‘Supported’) existsSupported 
  on t.case = existsSupported.case 

应该会带你去那里

【讨论】:

  • 你是怎么到那里的?
【解决方案3】:

按 CASE 字段分组
Result 字段的最大值(其中 S 大于 N)

declare @mytable table ([case] smallint, allegation smallint,result varchar(20))

insert into @mytable
values (1            , 1                 ,'Supported'),
(1           ,  2                   ,'Not Supported'),
(2          ,   1                   ,'Not Supported'),
(3        ,     1                   ,'Not Supported'),
(3       ,      2                   ,'Supported'),
(3      ,       3                   ,'Not Supported'),
(4     ,        1                   ,'Not Supported'),
(4     ,        2                   ,'Supported')



select [case], max(result) [Result]
 from @mytable
group by [case]

结果

1   Supported
2   Not Supported
3   Supported
4   Supported

【讨论】:

  • 这确实是一个不错的捷径,但如果在某些时候结果更改为不同的值或数据类型或外国 ket,那么您的方法将失败,甚至无法修改以获得相同的结果跨度>
  • 甚至不知道这是否是捷径,因为我只是根据要求以最简单的形式解决 OP。您不能真正假设其他值,因为它们都已在 OP 中给出。
猜你喜欢
  • 2021-05-08
  • 2019-09-07
  • 1970-01-01
  • 2016-02-21
  • 1970-01-01
  • 1970-01-01
  • 2015-06-04
  • 2014-05-13
  • 1970-01-01
相关资源
最近更新 更多