这里有一条SQL语句
SELECT COUNT(*) AS ACB
FROM APPL
WHERE CPTR_APPL_ID LIKE '%(' AND APPL.CRE_TS >= to_date('20190801','yyyymmdd')
AND APPL.CRE_TS < to_date('20190802','yyyymmdd')现在,它会在数据库中找到以“(”符号)结尾的所有应用程序的正确日期。是否有可能扩展这个单数查询,以便与我的数据库中以A、B或C或其他方式结尾的其他应用程序一起工作?他们都需要在同一天。我只需要对每个应用程序类型进行计数,并将其放入具有我选择的名称的列中。
我应该在哪里部分使用“OR”吗?
发布于 2019-08-22 19:41:45
有几种方法(实际上有很多种方法,但这些方法相对容易理解)。
选择计数:
WITH cte AS
(
SELECT CPTR_APPL_ID as typ
FROM APPL
WHERE APPL.CRE_TS >= DATE '2019-08-01' AND
APPL.CRE_TS < DATE '2019-08-02'
)
SELECT
(SELECT COUNT(*) FROM cte WHERE typ LIKE '%A') as count_a,
(SELECT COUNT(*) FROM cte WHERE typ LIKE '%B') as count_b,
...
FROM dual我从来没有对“选择列表中的选择”查询感兴趣。根据甲骨文需要扫描多少次表来进行计数,这个表的性能可能会很差。您可能希望cte作为第一步处理,这是一个减少的结果集,然后会被计算在内,但是您的优化者可能会非常不同地规划事情。
普通ISO SQL枢轴方法:
SELECT
SUM(CASE WHEN CPTR_APPL_ID LIKE '%A' THEN 1 END) as COUNT_A,
SUM(CASE WHEN CPTR_APPL_ID LIKE '%B' THEN 1 END) as COUNT_B,
...
FROM APPL
WHERE APPL.CRE_TS >= DATE '2019-08-01' AND
APPL.CRE_TS < DATE '2019-08-02'我喜欢的旋转方法,因为它工作在所有DB上。基本上,当将数据转换为null或1时,取决于它是否以A结尾(或B等),然后对所有1进行求和,给出一个计数。求和忽略零。可以通过不加和的列进行扩展,只要这些列出现在组by中。性能应该是好的,因为它可以通过对WHERE过滤器返回的数据进行一次传递。
枢轴语法:
SELECT * FROM
(
SELECT SUBSTR(CPTR_APPL_ID, -1) as typ
FROM APPL
WHERE APPL.CRE_TS >= DATE '2019-08-01' AND
APPL.CRE_TS < DATE '2019-08-02'
)
PIVOT
(
COUNT(typ)
FOR typ
IN ('A', 'B', ...) --this could be a query if you wanted dynamic
)缺点是它是专有的,但它可以是动态的或固定的列值。有些人真的很喜欢这个,还记得语法,其他人(我)总是要查一查。
让我知道这些查询是否有排字-它们是在没有任何测试的情况下编写的。它们都需要对您想要的特定代码进行一些调整,希望您能够看到所有代码中的模式并对其进行扩展。
发布于 2019-08-22 17:18:04
在我看来你的代码就像甲骨文。我认为聚合查询可以实现您想要的结果:
SELECT SUBSTR(CPTR_APPL_ID, -1), COUNT(*) AS ACB
FROM APPL
WHERE APPL.CRE_TS >= DATE '2019-08-01' AND
APPL.CRE_TS < DATE '2019-08-02'
GROUP BY SUBSTR(CPTR_APPL_ID, -1);https://stackoverflow.com/questions/57614208
复制相似问题