具有 NULL 值的 CASE WHEN 表达式 (Hiveql)
CASE WHEN expressions with NULL values (Hiveql)
我有以下查询:
SELECT
rv.country
, coalesce(rv.client_id, client_id2) as AccountID
, coalesce(c.name, rv.client_id2) as AccountName
, rv.prod_type as ProdType,
CASE WHEN cs.prod_type IS NULL THEN 'Unknown' ELSE cs.prod_type END as ProdType1,
ROUND(-SUM(CASE WHEN DATEDIFF(current_date(), rv.date_time) < 90 THEN rv.sold_prods END)) as Last3Months,
ROUND(-SUM(CASE WHEN DATEDIFF(current_date(), rv.date_time) < 180 THEN rv.sold_prods END)) as Last6Months,
ROUND(-SUM(CASE WHEN DATEDIFF(current_date(), rv.date_time) < 360 THEN rv.sold_prods END)) as Last12Months
FROM
commercial.sold_products rv
LEFT JOIN commercial.customer c
ON c.client_id2 = rv.client_id
LEFT JOIN
commercial.customer_description cs
ON
cs.clientid = c.client_id2
WHERE rv.country NOT IN ('US', 'JP')
AND cs.prod_type = rv.prod_type
GROUP BY
rv.country
, rv.client_id
, rv.client_id2
, cs.prod_type
, c.name
, rv.prod_type;
预期输出:(当然是当前值的数量)
我有 3 个 CASE WHEN 语句,它们应该代表过去 3、6 和 12 个月内售出的产品数量。但是,即使我知道我们在 22 天前向他们出售了产品(示例),一些客户仍显示 NULL 值。
我不确定这个查询有什么问题,所以如果您发现了什么,请告诉我!
还有!忽略columns/tables名字,因为公司隐私问题我改了。谢谢:)
像这样更改您的查询:
SELECT
rv.country
, coalesce(rv.client_id, client_id2) as AccountID
, coalesce(c.name, rv.client_id2) as AccountName
, rv.prod_type as ProdType,
CASE WHEN cs.prod_type IS NULL THEN 'Unknown' ELSE cs.prod_type END as ProdType1,
ROUND(-SUM(CASE WHEN DATEDIFF(current_date(), rv.date_time) < 90 THEN rv.sold_prods END)) as Last3Months,
ROUND(-SUM(CASE WHEN DATEDIFF(current_date(), rv.date_time) < 180 THEN rv.sold_prods END)) as Last6Months,
ROUND(-SUM(CASE WHEN DATEDIFF(current_date(), rv.date_time) < 360 THEN rv.sold_prods END)) as Last12Months
FROM
commercial.sold_products rv
LEFT JOIN commercial.customer c
ON c.client_id2 = rv.client_id
LEFT JOIN
commercial.customer_description cs
ON
cs.clientid = c.client_id2 AND cs.prod_type = rv.prod_type
WHERE rv.country NOT IN ('US', 'JP')
GROUP BY
rv.country
, coalesce(rv.client_id, rv.client_id2)
, rv.client_id2
, cs.prod_type
, coalesce(c.name, rv.client_id2)
, rv.prod_type;
如果不正确,您可以分享一些示例数据进行检查,我认为您应该按项目重点关注您的分组。
我有以下查询:
SELECT
rv.country
, coalesce(rv.client_id, client_id2) as AccountID
, coalesce(c.name, rv.client_id2) as AccountName
, rv.prod_type as ProdType,
CASE WHEN cs.prod_type IS NULL THEN 'Unknown' ELSE cs.prod_type END as ProdType1,
ROUND(-SUM(CASE WHEN DATEDIFF(current_date(), rv.date_time) < 90 THEN rv.sold_prods END)) as Last3Months,
ROUND(-SUM(CASE WHEN DATEDIFF(current_date(), rv.date_time) < 180 THEN rv.sold_prods END)) as Last6Months,
ROUND(-SUM(CASE WHEN DATEDIFF(current_date(), rv.date_time) < 360 THEN rv.sold_prods END)) as Last12Months
FROM
commercial.sold_products rv
LEFT JOIN commercial.customer c
ON c.client_id2 = rv.client_id
LEFT JOIN
commercial.customer_description cs
ON
cs.clientid = c.client_id2
WHERE rv.country NOT IN ('US', 'JP')
AND cs.prod_type = rv.prod_type
GROUP BY
rv.country
, rv.client_id
, rv.client_id2
, cs.prod_type
, c.name
, rv.prod_type;
预期输出:(当然是当前值的数量)
我有 3 个 CASE WHEN 语句,它们应该代表过去 3、6 和 12 个月内售出的产品数量。但是,即使我知道我们在 22 天前向他们出售了产品(示例),一些客户仍显示 NULL 值。
我不确定这个查询有什么问题,所以如果您发现了什么,请告诉我!
还有!忽略columns/tables名字,因为公司隐私问题我改了。谢谢:)
像这样更改您的查询:
SELECT
rv.country
, coalesce(rv.client_id, client_id2) as AccountID
, coalesce(c.name, rv.client_id2) as AccountName
, rv.prod_type as ProdType,
CASE WHEN cs.prod_type IS NULL THEN 'Unknown' ELSE cs.prod_type END as ProdType1,
ROUND(-SUM(CASE WHEN DATEDIFF(current_date(), rv.date_time) < 90 THEN rv.sold_prods END)) as Last3Months,
ROUND(-SUM(CASE WHEN DATEDIFF(current_date(), rv.date_time) < 180 THEN rv.sold_prods END)) as Last6Months,
ROUND(-SUM(CASE WHEN DATEDIFF(current_date(), rv.date_time) < 360 THEN rv.sold_prods END)) as Last12Months
FROM
commercial.sold_products rv
LEFT JOIN commercial.customer c
ON c.client_id2 = rv.client_id
LEFT JOIN
commercial.customer_description cs
ON
cs.clientid = c.client_id2 AND cs.prod_type = rv.prod_type
WHERE rv.country NOT IN ('US', 'JP')
GROUP BY
rv.country
, coalesce(rv.client_id, rv.client_id2)
, rv.client_id2
, cs.prod_type
, coalesce(c.name, rv.client_id2)
, rv.prod_type;
如果不正确,您可以分享一些示例数据进行检查,我认为您应该按项目重点关注您的分组。