如何在多列上编写不同条件的查询?我很难在以下问题中获得准确的结果

问题描述 投票:0回答:3
组织 销售编号 充电
AA 1 20 十一月
AA 2 30 十二月
BB 1 20 十二月
BB 2 00 十二月
BB 3 00 十二月
BB 1 20 十一月
BB 2 00 十一月
抄送 3 00 十二月

我有上表的扩展版本。基本上,我希望找到每个月销售 ID 不为 1 的所有其他费用的总和为零的 ORG 记录。

因此,对于结果,我希望得到与上表类似的结果:

组织
BB 十一月
BB 十二月
抄送 十二月

我尝试了各种查询,但这是最新的:

SELECT "MONTH", "ORG"
FROM 
  (SELECT DISTINCT "MONTH" , "CHARGE", "SALE_ID" ,"ORG" 
  CASE WHEN "SALE_ID" != 1  AND "SALE_ID" IS NOT NULL AND SUM("CHARGE") OVER(PARTITION BY "ORG", "MONTH" )=0
THEN "ORG" END 
  FROM "TABLE" WHERE 
"MONTH" >= '01-JAN-2023'  )
GROUP BY    "MONTH", "ORG"

sql oracle-sqldeveloper
3个回答
0
投票

您的方向是正确的,但存在一些问题。

  1. 子查询缺少别名
  2. Case 语句未用于生成新列。
  3. 根据您的月份列,“01-JAN-2023”这将不起作用。

我已经重写了您的查询,它可能看起来像这样。您可能需要修改过滤。

WITH cte
AS (
    SELECT "ORG"
        ,"MONTH"
        ,SUM(CASE WHEN "SALE_ID" != 1 THEN "CHARGE"
                ELSE 0 END) AS OtherCharges
        ,MAX(CASE WHEN "SALE_ID" = 1 THEN "CHARGE"
                ELSE 0 END) AS Sale1Charge
    FROM "TABLE"
    WHERE "MONTH" IN ('NOV','DEC', '...')
    GROUP BY "ORG","MONTH"
    )
SELECT "ORG","MONTH"
FROM cte
WHERE OtherCharges = 0 AND Sale1Charge > 0

0
投票

类似:

SELECT "MONTH" , "ORG" 
FROM "TABLE" 
WHERE "SALE_ID" != 1
GROUP BY "MONTH" , "ORG"
HAVING sum("CHARGE") = 0

0
投票

使用

HAVING
子句和条件聚合:

SELECT org,
       month
FROM   table_name
GROUP BY
       org, month
HAVING SUM(CASE WHEN sale_id != 1 THEN charge END) = 0

对于样本数据:

CREATE TABLE table_name (ORG, SALE_ID, CHARGE, MONTH) AS
SELECT 'AA', 1, 20, 'NOV' FROM DUAL UNION ALL
SELECT 'AA', 2, 30, 'DEC' FROM DUAL UNION ALL
SELECT 'BB', 1, 20, 'DEC' FROM DUAL UNION ALL
SELECT 'BB', 2, 00, 'DEC' FROM DUAL UNION ALL
SELECT 'BB', 3, 00, 'DEC' FROM DUAL UNION ALL
SELECT 'BB', 1, 20, 'NOV' FROM DUAL UNION ALL
SELECT 'BB', 2, 00, 'NOV' FROM DUAL UNION ALL
SELECT 'CC', 3, 00, 'DEC' FROM DUAL;

输出:

组织
抄送 十二月
BB 十一月
BB 十二月

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.