从重复表

时间:2017-12-07 15:22:15

标签: sql oracle

我无法找到实现这一目标的最佳方法。如果可能的话,我只想用一个选择查询解决它,但我不确定它是否可以通过选择来解决。

客户重复表:
- customer_id(PK)
- 年(PK)
- code1
- code2

这是一个重复的表格,因此客户有多个条目,其中包含同年的ID号。

我需要一些如何收集布尔值或SELECT'Y'作为标志,其中:

WHERE customer_id  = '1001'  
AND year = '2017'  
AND...

如果该客户的每个代码都有任何情况2 where(sum(code1 LIKE'D%')< = sum(code1 LIKE'R%'))然后我需要返回TRUE或'Y'

示例表

id      year    code1   code2

1001    2017    RE      AB
1001    2017    D2      AB
1001    2017    RW      BC

所以在这里,它将返回TRUE,因为对于代码2是AB,

sum(code1 LIKE 'D%') <= sum(code1 LIKE 'R%') = TRUE

我需要比较客户拥有的所有不同代码2的code1的总和。

2 个答案:

答案 0 :(得分:1)

我认为你只需要在此处抛出一些CASE语句并汇总:

SELECT
  CASE WHEN Sum(CASE WHEN code1 LIKE 'D%' THEN 1 ELSE 0 END) <= Sum(CASE WHEN code1 LIKE 'R%' THEN 1 ELSE 0 END) THEN 'True' ELSE 'False' END AS yourtest
FROM yourTable
WHERE id=1001 AND year=2017

答案 1 :(得分:0)

我相信这就是你所需要的。我在WITH子句中创建了更多的测试数据(仅用于测试,实际数据不需要它)。我将列名从yr更改为year,因为是Oracle关键字,不应将其用作表名或列名。

我为每个FLAG1值创建了一个初始标记code2 - 用于计算每个FLAG2组合的最终标记(id, yr)。在我的查询中,我显示了两个标志,这样你就可以看到它是如何工作的;你可能只需要FLAG2

并不是很清楚你需要什么输出;我假设你只是想要一个额外的标志来补充输入数据。如果您需要其他东西,也许您可​​以自己调整它。如果需要添加特定的id和特定年份,可以通过向子查询添加WHERE子句来实现此目的(在这种情况下,您可以通过删除id来清理分析函数和yr条款中的PARTITION BY

with
  inputs ( id, yr, code1, code2 ) as (
    select 1001, 2017, 'RE', 'AB' from dual union all
    select 1001, 2017, 'D2', 'AB' from dual union all
    select 1001, 2017, 'RW', 'BC' from dual union all
    select 1004, 2015, 'RE', 'ZZ' from dual union all
    select 1004, 2015, 'DW', 'XX' from dual union all
    select 1004, 2016, 'RX', 'ZZ' from dual
  )
-- End of simulated inputs (for testing only, not part of the solution).
-- SQL query begins below this line. Use your actual table and column names.
select id, yr, code1, code2, flag1,
       case count(case flag1 when 'FALSE' then 1 end)
                                            over (partition by id, yr)
            when 0 then 'TRUE' else 'FALSE' end as flag2
from   (       
         select id, yr, code1, code2,
                case when count(case when code1 like 'D%' then 1 end) 
                                            over (partition by id, yr, code2)
                          <=
                          count(case when code1 like 'R%' then 1 end)
                                            over (partition by id, yr, code2)
                     then 'TRUE' else 'FALSE' end as flag1
         from   inputs
       )
;

        ID         YR CODE1 CODE2 FLAG1 FLAG2
---------- ---------- ----- ----- ----- -----
      1001       2017 RE    AB    TRUE  TRUE 
      1001       2017 D2    AB    TRUE  TRUE 
      1001       2017 RW    BC    TRUE  TRUE 
      1004       2015 DW    XX    FALSE FALSE
      1004       2015 RE    ZZ    TRUE  FALSE
      1004       2016 RX    ZZ    TRUE  TRUE