BigQuery SQL «НЕ В» не исключая результатов - PullRequest
0 голосов
/ 17 мая 2019

Я пытаюсь отфильтровать некоторые записи из запроса 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)

Мое второе предложение НЕТ должно удалить еще 293 заказа из общей суммы, но эти номера заказов все еще присутствуют.Если я закомментирую эти два предложения WHERE, я получу одинаковое количество результатов, поэтому ясно, что заказы, которые они возвращают, не исключаются, что я упускаю в своем коде, чтобы исключить эти записи?

1 Ответ

1 голос
/ 17 мая 2019

Может быть, вы ищете НЕ В СОЮЗЕ Между запросами по номеру заказа

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...