Сообщение 207 Недопустимый столбец с использованием CTE в предложении WHERE - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь сослаться на CTE в предложении WHERE, но получаю сообщение об ошибке 207 для неверного имени столбца ... вот мой код SQL.

WITH CTE (ClientNumber) AS 
(
    SELECT DISTINCT 
        i.ClientKey AS ClientNumber 
    FROM 
        [PROD].[dbo].[Invoices] i  
    WHERE 
        MONTH(i.InvDate) = '1' 
        AND YEAR(i.InvDate) = '2017' AND i.ClientKey <> '11'
)
SELECT 
    YEAR(i.InvDate),  
    MONTH(i.InvDate), 
    COUNT(DISTINCT i.ClientKey) AS ClientCount 
FROM 
    [PROD].[dbo].[Invoices] i 
JOIN 
    CTE e ON e.ClientNumber = i.ClientKey 
WHERE 
    YEAR(i.InvDate) = 2017 
    AND i.ClientKey IN (CTE) 
GROUP BY 
    1, 2;               

Результат:

Сообщение 207, Уровень 16, Состояние 1, Строка 14
Неверное имя столбца 'CTE'.

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Я упростил оператор select, включив в него только месяц и только группу по месяцам, но он все равно дал мне ошибку ... msg 164, каждое выражение GROUP BY должно содержать хотя бы один столбец, который не является внешней ссылкой.Кроме того, я использую SSMS, если это помогает.

WITH CTE (ClientName, ClientNumber) AS 
(SELECT DISTINCT c.Name, i.ClientKey AS ClientNumber
FROM .[NOW].[dbo].[Clients] c
JOIN  .[NOW].[dbo].[Invoices] i ON i.ClientKey = c.ClientKey
WHERE MONTH(i.InvDate) = '1' AND YEAR(i.InvDate) = '2018' AND i.ClientKey <> '11')

SELECT
MONTH(i.InvDate), 
COUNT (DISTINCT ClientName) AS ClientCount
FROM CTE e 
JOIN .[NOW].[dbo].[Invoices] i ON i.ClientKey = e.ClientNumber
WHERE i.ClientKey IN (SELECT ClientNumber FROM CTE)
GROUP BY 1;
0 голосов
/ 04 декабря 2018

Я думаю, что это связано со сравнением CTE.

Я изменил его следующим образом:

AND i.ClientKey IN (select ClientNumber from CTE) 

WITH CTE (ClientNumber) AS 
(
    SELECT DISTINCT 
        i.ClientKey AS ClientNumber 
    FROM 
        [PROD].[dbo].[Invoices] i  
    WHERE 
        MONTH(i.InvDate) = '1' 
        AND YEAR(i.InvDate) = '2017' 
        AND i.ClientKey <> '11'
)
SELECT
    YEAR(i.InvDate),  
    MONTH(i.InvDate), 
    COUNT(DISTINCT i.ClientKey) AS ClientCount 
FROM 
    [PROD].[dbo].[Invoices] i 
JOIN 
    CTE e ON e.ClientNumber = i.ClientKey 
WHERE 
    YEAR(i.InvDate) = 2017 
     AND i.ClientKey IN (SELECT ClientNumber FROM CTE) 
GROUP BY 
    1, 2; 
...