【问题标题】:Select groups based off of single row value within group?根据组内的单行值选择组?
【发布时间】:2019-09-07 22:07:23
【问题描述】:

我正在处理工资单数据,我只想提取有加班的支票。一张带有加班费的支票将有一行显示工资单代码“5”。我知道我可以过滤并带回其中包含“5”的行,但我需要资格检查中的所有行,而不仅仅是其中包含“5”的行。

这是数据的基本示例:

ROW  CHKNUM  PAYCODE  AMOUNT
1    000010     1        $15
2    000010     1N       $20
3    000010     5        $25
4    000011     1        $15
5    000011     1N       $20
6    000012     1        $15
7    000012     5        $25
8    000013     1        $15
9    000014     1        $15
10   000014     5N       $30

我需要返回支票号 10、12 和 14 的所有行,因为该支票号包含“5”支付代码。 (还需要所有以 5 开头的支付代码)

【问题讨论】:

    标签: sql tsql reporting-services


    【解决方案1】:

    你可以使用exists

    select t.*
    from table t
    where exists (select 1 from table t1 where t1.chknum = t.chknum and t1.paycode like '5%');
    

    【讨论】:

    • 'select 1'有什么作用?
    • @Christian Love 它满足了 SELECT 语句选择某些东西的要求。在 EXISTS 子选择的情况下,实际上没有数据返回到外部 SELECT,而是解析为 True 或 False。
    【解决方案2】:

    这会更简单:

    select * from Table1 where "CHKNUM" in(select "CHKNUM" from Table1 where 
    regexp_like("PAYCODE",'(.)*5(.)*'));
    

    查看http://sqlfiddle.com/#!4/6acf0/4

    对于 tsql 类似:

    select * from Table1 where "CHKNUM" in(select "CHKNUM" from Table1 
    where PATINDEX ('(.)*5(.)*',"PAYCODE")=0);
    

    http://sqlfiddle.com/#!18/66036/3

    使用这个:

     select * from Table1 where "CHKNUM" in(select "CHKNUM" from Table1 
     where "PAYCODE" like '5%');
    

    http://sqlfiddle.com/#!18/66036/5

    【讨论】:

    • 这通常会显着降低性能吗?我尝试了上述两种方法,最终等待了很长时间才能执行。实际上我只是仔细检查了一个特定的支票号码,它不包含任何“5%”的支付代码
    • 最后一个根本没有提高性能,但是我将数据源更改为表而不是我创建的视图并且它工作。谢谢!
    【解决方案3】:

    这就足够了:

    SELECT * FROM #Payroll
    WHERE CHKNUM in (select CHKNUM from #Payroll where PAYCODE like '5%')
    

    【讨论】:

      猜你喜欢
      • 2015-06-04
      • 2016-02-21
      • 1970-01-01
      • 1970-01-01
      • 2021-05-08
      • 2021-11-17
      • 2021-11-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多