我无法找到实现这一目标的最佳方法。如果可能的话,我只想用一个选择查询解决它,但我不确定它是否可以通过选择来解决。
客户重复表:
- 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的总和。
答案 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