Подзапрос с WHERE NOT IN не фильтрует данные, как ожидалось - PullRequest
1 голос
/ 15 апреля 2019

У меня есть подзапрос, который работает автономно, но при использовании в качестве фильтра, похоже, ничего не делает.

Мои данные не содержат NULL. Я могу выполнить подзапрос и получить количество ожидаемых клиентов (клиентов с идентификаторами PID, такими как% CLUSTER%), но когда я выполняю полный запрос, предложение WHERE NOT IN, по-видимому, не отфильтровывает клиентов в подзапросе. запрос выбирает.

SELECT PID, ROUND(SUM(bookings),0) AS Bookings
FROM d_bookings
WHERE GU_Name NOT IN (
    SELECT DISTINCT(GU_NAME)
    FROM d_bookings 
    WHERE PID LIKE '%CLUSTER%'
    AND Sales_Level_1 IN (
    'GLOBAL SERVICE PROVIDER'
    ,'APJC__'
    ,'EMEAR-REGION'
    ,'AMERICAS'
    ,'CORP ADJUSTMENT'
    )
    AND Corp_Bookings = 'Y'
)
GROUP BY PID
ORDER BY Bookings DESC;

Результат не должен содержать PID, таких как% CLUSTER%. На английском я хочу получить общее количество бронирований для всех PID, проданных клиентам, которые не приобрели кластер. Подзапрос составляет список клиентов, которые DID покупают кластер, и я пытаюсь исключить этих клиентов из результата.

Вот пример таблицы:

DROP TABLE IF EXISTS tmpbook;
CREATE TABLE tmpbook ("FYQ" char(10), "gu_name" char(10),"PID" char(20), "bookings" numeric);
INSERT INTO tmpbook
    VALUES 
        ('FY2019Q1', 'Company1','CLUSTER1',12345.67),
        ('FY2019Q1', 'Company1','SOMETHINGELSE',2345.67),
        ('FY2019Q1', 'Company2','CLUSTER2',345.67),
        ('FY2019Q1', 'Company2','SOMETHINGELSE',12345.67),
        ('FY2019Q1', 'Company3','SOMETHINGELSE',2345.67),
        ('FY2019Q1', 'Company3','SOMETHINGELSE',345.67) 
;

Ожидаемый результат будет NOTACLUSTER 2691,34 (2345,67 + 345,67)

потому что только Компания3 не купила кластер (следует исключить Компанию1 и Компанию2, потому что они ДА купили кластер.

Ответы [ 3 ]

1 голос
/ 15 апреля 2019

Возможно, остальная часть предложения WHERE в подзапросе должна быть в основном запросе:

SELECT PID, ROUND(SUM(bookings),0) AS Bookings
FROM d_bookings
WHERE GU_Name NOT IN (
    SELECT DISTINCT(GU_NAME)
    FROM d_bookings 
    WHERE PID LIKE '%CLUSTER%'
    )
    AND Corp_Bookings = 'Y'
    AND Sales_Level_1 IN (
    'GLOBAL SERVICE PROVIDER'
    ,'APJC__'
    ,'EMEAR-REGION'
    ,'AMERICAS'
    ,'CORP ADJUSTMENT'
)
GROUP BY PID
ORDER BY Bookings DESC;

Но если это так, вы можете заменить подзапрос НЕ НРАВИТСЯ, вместо этого:

SELECT PID, ROUND(SUM(bookings),0) AS Bookings
FROM d_bookings
WHERE PID NOT LIKE '%CLUSTER%'
    AND Corp_Bookings = 'Y'
    AND Sales_Level_1 IN (
    'GLOBAL SERVICE PROVIDER'
    ,'APJC__'
    ,'EMEAR-REGION'
    ,'AMERICAS'
    ,'CORP ADJUSTMENT'
    )
GROUP BY PID
ORDER BY Bookings DESC;
1 голос
/ 15 апреля 2019

похоже, что ваш запрос должен дать вам пустой результат.в качестве условия WHERE PID LIKE "% CLUSTER%" верно для обоих типов записей.

например,

'Cluster1' LIKE '%CLUSTER%' --is  true

'NotACluster' LIKE '%CLUSTER%' --is  true

, поэтому, если вы хотите выбрать все записи, такие как 'Cluster1', 'Cluster1 'и т. Д., Тогда условие должно выглядеть следующим образом:

PID LIKE 'Cluster%'

0 голосов
/ 15 апреля 2019

У меня закончились две проблемы.1 - мои данные были испорчены.2 - мой подзапрос для основного запроса требовал тех же ограничений.

SELECT PID, ROUND(SUM(BOOKINGS),0) AS BOOKINGS
FROM d_bookings
WHERE GU_Name NOT IN (
    SELECT GU_NAME
    FROM d_bookings
    WHERE PID LIKE '%CLUSTER%'
    AND Sales_Level_1 IN (
    'GLOBAL SERVICE PROVIDER'
    ,'APJC__'
    ,'EMEAR-REGION'
    ,'AMERICAS'
    ,'CORP ADJUSTMENT'
    )
    AND Corp_Bookings = 'Y')
AND Sales_Level_1 IN (
    'GLOBAL SERVICE PROVIDER'
    ,'APJC__'
    ,'EMEAR-REGION'
    ,'AMERICAS'
    ,'CORP ADJUSTMENT'
    )
AND Corp_Bookings = 'Y'
GROUP BY PID
ORDER BY BOOKINGS DESC;
...