Sql 显示大小写表达式中的空行
我正在编写一个sql报告,其中一个要求是为CASE表达式的两个选项都包含行 该报告将显示数据库中所有客户与3个选定客户之间的“成本核算”和“非成本核算”交易的计数 请参见所需的示例布局Sql 显示大小写表达式中的空行,sql,oracle,case,Sql,Oracle,Case,我正在编写一个sql报告,其中一个要求是为CASE表达式的两个选项都包含行 该报告将显示数据库中所有客户与3个选定客户之间的“成本核算”和“非成本核算”交易的计数 请参见所需的示例布局 CUSTOMER_ID | CUSTOMER_NAME | COSTING | CUST_1 | CUST_2 | CUST_3 12 | Red Corp | Non-costing | 1245 | 734 | 84 12 | Red Corp
CUSTOMER_ID | CUSTOMER_NAME | COSTING | CUST_1 | CUST_2 | CUST_3
12 | Red Corp | Non-costing | 1245 | 734 | 84
12 | Red Corp | Costing | 376 | 23 | 2
17 | Blue Corp | Non-costing | 4538 | 36 | 3256
17 | Blue Corp | Costing | 0 | 0 | 0
...
我曾尝试将成本计算列放入案例陈述中。但是,我无法在输出中显示示例“Blue Corp”“Costing”行,因为该行为空
select CUSTOMER_ID
,CUSTOMER_NAME
,case
when PURCHASE_VALUE = 0 or PURCHASE_VALUE is null then 'Non-costing'
when PURCHASE_VALUE != 0 or PURCHASE_VALUE is not null then 'Costing'
end AS COSTING
,count(CASE WHEN CUSTOMER_ID = 11 then 1 ELSE NULL END) as "CUST_1"
,count(CASE WHEN CUSTOMER_ID = 22 then 1 ELSE NULL END) as "CUST_2"
,count(CASE WHEN CUSTOMER_ID = 33 then 1 ELSE NULL END) as "CUST_3"
from schema.CUSTOMER_TRANSACTIONS
group by case
when PURCHASE_VALUE = 0 or PURCHASE_VALUE is null then 'Non-costing'
when PURCHASE_VALUE != 0 or PURCHASE_VALUE is not null then 'Costing'
end
,CUSTOMER_ID
,CUSTOMER_NAME
我目前得到的与示例相同,但缺少0计数行。
请参阅下面我目前得到的输出
CUSTOMER_ID | CUSTOMER_NAME | COSTING | CUST_1 | CUST_2 | CUST_3
12 | Red Corp | Non-costing | 1245 | 734 | 84
12 | Red Corp | Costing | 376 | 23 | 2
17 | Blue Corp | Non-costing | 4538 | 36 | 3256
...
你可以试试这个。当没有时,它将给你0
select CUSTOMER_ID
,CUSTOMER_NAME
, CASE WHEN ISNULL(PURCHASE_Value,0) = 0 THEN 'Non-costing' ELSE 'Costing' END
,SUM(CASE WHEN CUSTOMER_ID = 11 then 1 ELSE 0 END) as "CUST_1"
,SUM(CASE WHEN CUSTOMER_ID = 22 then 1 ELSE 0 END) as "CUST_2"
,SUM(CASE WHEN CUSTOMER_ID = 33 then 1 ELSE 0 END) as "CUST_3"
from schema.CUSTOMER_TRANSACTIONS
group by CUSTOMER_ID
,CUSTOMER_NAME
,PURCHASE_Value
从你的评论来看
亚历克斯·普尔,你是对的,没有关于“成本计算”的数据
“蓝色公司”。但是,我希望该行显示0,而不是0
根本没有出现
我认为您需要生成其中一个成本计算不可用的记录
我试图创建一个查询,如果任何客户都没有“成本核算”或“非成本核算”记录,该查询将生成该记录
我无法测试它,所以如果您遇到任何问题,请与我们分享
-- Your original query starts from here
WITH DATAA AS (select CUSTOMER_ID
,CUSTOMER_NAME
,case
when PURCHASE_VALUE = 0 or PURCHASE_VALUE is null then 'Non-costing'
when PURCHASE_VALUE != 0 or PURCHASE_VALUE is not null then 'Costng'
end AS COSTING
,count(CASE WHEN CUSTOMER_ID = 11 then 1 ELSE NULL END) as "CUST_1"
,count(CASE WHEN CUSTOMER_ID = 22 then 1 ELSE NULL END) as "CUST_2"
,count(CASE WHEN CUSTOMER_ID = 33 then 1 ELSE NULL END) as "CUST_3"
from schema.CUSTOMER_TRANSACTIONS
group by case
when PURCHASE_VALUE = 0 or PURCHASE_VALUE is null then 'Non-costing'
when PURCHASE_VALUE != 0 or PURCHASE_VALUE is not null then 'Costing'
end
,CUSTOMER_ID
,CUSTOMER_NAME)
-- Your original query ends here
-- Solution
SELECT
CUSTOMER_ID,
CUSTOMER_NAME,
COSTING,
CUST_1,
CUST_2,
CUST_3
FROM
DATAA
UNION ALL
( SELECT
CUSTOMER_ID,
CUSTOMER_NAME,
CASE
WHEN COUNT(CASE
WHEN COSTING = 'Non-costing' THEN 1
END) = 0 THEN 'Non-costing'
WHEN COUNT(CASE
WHEN COSTING = 'Costing' THEN 1
END) = 0 THEN 'Costing'
END AS COSTING,
0,
0,
0
FROM
DATAA D1
GROUP BY
CUSTOMER_ID,
CUSTOMER_NAME
HAVING ( COUNT(CASE
WHEN COSTING = 'Non-costing' THEN 1
END) = 0
OR COUNT(CASE
WHEN COSTING = 'Costng' THEN 1
END) = 0 )
);
干杯 使用
交叉连接
生成行,使用左连接
添加列:
select c.CUSTOMER_ID, c.CUSTOMER_NAME, t.costing,
sum(CASE WHEN CUSTOMER_ID = 11 then 1 ELSE 0 END) as CUST_1,
sum(CASE WHEN CUSTOMER_ID = 22 then 1 ELSE 0 END) as CUST_2,
sum(CASE WHEN CUSTOMER_ID = 33 then 1 ELSE 0 END) as CUST_3
from (select distinct ct.customer_id, ct.customer_name
from schema.CUSTOMER_TRANSACTIONS ct
) c cross join
(select 'Non-costing' as costing from dual union all
select 'Costing' from dual
) t left join
schema.customer_transactions ct
on c.customer_id = ct.customer_id,
t.costing = (case when PURCHASE_VALUE = 0 or PURCHASE_VALUE is null
then 'Non-costing'
else 'Costing'
end)
group by c.CUSTOMER_ID, c.CUSTOMER_NAME, t.type;
我不能理解你的问题?你能提供你期望的结果吗?我希望它看起来像顶部的示例表。目前你得到了什么输出?你也可以发布吗?这似乎是由于你的客户端应用程序的格式问题。您使用什么来运行SQL?Standin.Wolf我已经更新了问题,以包含我当前输出的清晰示例。您不认为这会出错,因为
PURCHASE\u Value
直接用于SELECT
,而不是groupby
?这很完美,它准确地解决了我的问题。非常感谢。