sql - BigQuery SQL 'NOT IN' 不排除结果
问题描述
我正在尝试使用 过滤掉 BigQuery 查询中的一些记录WHERE NOT IN
,但是,无论是否使用此代码,我都会得到相同数量的结果,并且仍然包含我所需的排除项。
这是我的查询:
SELECT
EmailHash,
DATE(MAX(OrderDate)) AS max_ord_date
FROM `project.dataset.Header`
WHERE Date(OrderDate) = '2019-05-15'
# AND mb_company = 'CORE'
AND CancelledFlag IS NOT True
AND AmountPaid > 0
# Exclude these order numbers
AND ordernumber NOT IN (
SELECT ordernumber FROM(
SELECT
ordernumber,
SUM(SAFE_CAST(StockOutQuantity AS INT64)) AS so,
SUM(QuantityCancelled) AS cx,
SUM(Quantity) AS ord
FROM `project.dataset.Detail`
WHERE Date(OrderDate) = '2019-05-15'
GROUP BY ordernumber
HAVING so = ord)
)
# Exclude these order numbers
AND ordernumber NOT IN (
SELECT ordernumber FROM(
SELECT
ordernumber,
SUM(AmountPaid) ap,
ROUND(SUM(AmountPaid) - (SUM(PnPOrder) + SUM(PnPOrderTax)),2) ap_ntx,
SUM(RefundedValue) rv,
SUM(GoodsNet) gn
FROM `project.dataset.Header`
WHERE Date(OrderDate) = '2019-05-15'
GROUP BY ordernumber
HAVING (ap = rv) OR (ap_ntx = rv) OR (gn = rv)
)
)
GROUP BY EmailHash
运行此查询将返回 10802 个结果。
当我运行下面的 SQL 时,我看到 17 个订单应该从总结果中排除。
SELECT ordernumber FROM(
SELECT
ordernumber,
SUM(SAFE_CAST(StockOutQuantity AS INT64)) AS so,
SUM(QuantityCancelled) AS cx,
SUM(Quantity) AS ord
FROM `project.dataset.Detail`
WHERE Date(OrderDate) = '2019-05-15'
GROUP BY ordernumber
HAVING so = ord)
我的第二个 NO 子句应该从总数中再删除 293 个订单,但这些订单号仍然存在。如果我注释掉这两个 WHERE 子句,我会得到相同数量的结果,所以很明显它们返回的订单没有被排除,我的代码中缺少什么来排除这些记录?
解决方案
您是否正在寻找订单号的队列之间的 NOT IN the UNION
SELECT
EmailHash,
DATE(MAX(OrderDate)) AS max_ord_date
FROM `project.dataset.Header`
WHERE Date(OrderDate) = '2019-05-15'
# AND mb_company = 'CORE'
AND CancelledFlag IS NOT True
AND AmountPaid > 0
# Exclude these order numbers
AND ordernumber NOT IN (
SELECT ordernumber FROM(
SELECT
ordernumber,
SUM(SAFE_CAST(StockOutQuantity AS INT64)) AS so,
SUM(QuantityCancelled) AS cx,
SUM(Quantity) AS ord
FROM `project.dataset.Detail`
WHERE Date(OrderDate) = '2019-05-15'
GROUP BY ordernumber
HAVING so = ord)
UNION
SELECT ordernumber FROM(
SELECT
ordernumber,
SUM(AmountPaid) ap,
ROUND(SUM(AmountPaid) - (SUM(PnPOrder) + SUM(PnPOrderTax)),2) ap_ntx,
SUM(RefundedValue) rv,
SUM(GoodsNet) gn
FROM `project.dataset.Header`
WHERE Date(OrderDate) = '2019-05-15'
GROUP BY ordernumber
HAVING (ap = rv) OR (ap_ntx = rv) OR (gn = rv)
)
)
GROUP BY EmailHash
推荐阅读
- inno-setup - Inno Setup 语言文件 (isl) 中的完整预处理器支持
- python - 使用 BurpSuite 时 Python 请求 https:没有但代码 200 的代码 403
- javascript - 在 Angular 8 中,哪一种是 DOM 操作的最佳方式
- python - 来自 jupyter notebook 的漂亮打印 python 代码
- jquery - 如何将单击的元素定义为 $(this)?
- .net - 检查用户输入是否是 NeutralCultures 列表的一部分
- json - 如何从 LUIS V3 预测端点 json 反序列化 dateTimeV2 实体
- string - 字符串替换不适用于 if 语句
- groovy - 访问配置文件中的复杂键
- grafana - Oauth 用户的星型仪表板