Получение "Нет столбца для столбца 2" d "в sql server cte?
У меня есть этот запрос, но он не работает так, как должен,
with c as (select
month(bookingdate) as duration,
count(*) as totalbookings
from
entbookings
group by month(bookingdate)
),
d as (SELECT
duration,
sum(totalitems)
FROM
[DrySoftBranch].[dbo].[mnthItemWiseTotalQty] ('1') AS BkdQty
group by duration
)
select
c.duration,
c.totalbookings,
d.bkdqty
from
c
inner join d
on c.duration = d.duration
когда я запускаю это, я получаю
Msg 8155, уровень 16, состояние 2, строка 1
Для столбца 2 'd' не указан столбец.
Может ли кто-нибудь сказать мне, что я делаю неправильно?
Кроме того, когда я запускаю это,
with c as (select
month(bookingdate) as duration,
count(*) as totalbookings
from
entbookings
group by month(bookingdate)
),
d as (select
month(clothdeliverydate),
SUM(CONVERT(INT, deliveredqty))
FROM
barcodetable
where
month(clothdeliverydate) is not null
group by month(clothdeliverydate)
)
select
c.duration,
c.totalbookings,
d.bkdqty
from
c
inner join d
on c.duration = d.duration
Я получаю
Msg 8155, уровень 16, состояние 2, строка 1
Для столбца 1 'd' не указан столбец.
Msg 8155, уровень 16, состояние 2, строка 1
Для столбца 2 'd' не указан столбец.
Ответы
Ответ 1
[править]
Я попытался переписать ваш запрос, но даже ваш будет работать, как только вы свяжете псевдонимы с агрегатными столбцами в запросе, который определяет "d".
Я думаю, вы ищете следующее:
Первый:
select
c.duration,
c.totalbookings,
d.bkdqty
from
(select
month(bookingdate) as duration,
count(*) as totalbookings
from
entbookings
group by month(bookingdate)
) AS c
inner join
(SELECT
duration,
sum(totalitems) 'bkdqty'
FROM
[DrySoftBranch].[dbo].[mnthItemWiseTotalQty] ('1') AS BkdQty
group by duration
) AS d
on c.duration = d.duration
Второй:
select
c.duration,
c.totalbookings,
d.bkdqty
from
(select
month(bookingdate) as duration,
count(*) as totalbookings
from
entbookings
group by month(bookingdate)
) AS c
inner join
(select
month(clothdeliverydate) 'clothdeliverydatemonth',
SUM(CONVERT(INT, deliveredqty)) 'bkdqty'
FROM
barcodetable
where
month(clothdeliverydate) is not null
group by month(clothdeliverydate)
) AS d
on c.duration = d.duration
Ответ 2
Вам просто нужно предоставить псевдоним для ваших полных столбцов в CTE
d as (SELECT
duration,
sum(totalitems) as sumtotalitems
FROM
[DrySoftBranch].[dbo].[mnthItemWiseTotalQty] ('1') AS BkdQty
group by duration
)
Ответ 3
Поскольку вы создаете табличное выражение creatin, вам нужно указать структуру этой таблицы, вы можете добиться этого двумя способами:
1: в элементе select вы можете использовать исходные имена столбцов (как в первом примере), но с агрегатами вы должны использовать псевдоним (также в конфликтующих именах). Как
sum(totalitems) as bkdqty
2: вам нужно указать имена столбцов rigth после имени talbe, а затем вам просто нужно позаботиться о том, чтобы подсчет имен должен был определять количество кулонов в запросе. Как:
d (duration, bkdqty)
AS (Select.... )
При втором решении оба ваших запроса будут работать!
Ответ 4
У меня был аналогичный запрос и аналогичная проблема.
SELECT
*
FROM
Users ru
LEFT OUTER JOIN
(
SELECT ru1.UserID, COUNT(*)
FROM Referral r
LEFT OUTER JOIN Users ru1 ON r.ReferredUserId = ru1.UserID
GROUP BY ru1.UserID
) ReferralTotalCount ON ru.UserID = ReferralTotalCount.UserID
Я обнаружил, что SQL Server задыхается в столбце COUNT(*)
и дает мне ошибку. Для столбца 2 не указан столбец.
Внесение псевдонима в столбец COUNT(*)
устраняет проблему.
SELECT
*
FROM
Users ru
LEFT OUTER JOIN
(
SELECT ru1.UserID, COUNT(*) AS -->MyCount<--
FROM Referral r
LEFT OUTER JOIN Users ru1 ON r.ReferredUserId = ru1.UserID
GROUP BY ru1.UserID
) ReferralTotalCount ON ru.UserID = ReferralTotalCount.UserID
Ответ 5
Довольно интуитивное сообщение об ошибке - просто нужно указать столбцы в именах d
Измените либо этот
d as
(
select
[duration] = month(clothdeliverydate),
[bkdqty] = SUM(CONVERT(INT, deliveredqty))
FROM
barcodetable
where
month(clothdeliverydate) is not null
group by month(clothdeliverydate)
)
Или вы можете явно объявить поля в определении cte:
d ([duration], [bkdqty]) as
(
select
month(clothdeliverydate),
SUM(CONVERT(INT, deliveredqty))
FROM
barcodetable
where
month(clothdeliverydate) is not null
group by month(clothdeliverydate)
)
Ответ 6
Просто добавьте псевдоним следующим образом:
sum (totalitems) как totalitems.
Ответ 7
очевидно, как указано в ответе парсера, для обоих случаев требуется имя столбца. В обеих версиях столбцы "d" не называются.
в случае 1: ваш столбец 2 из d есть sum(totalitems)
, который не назван. duration
сохранит имя "продолжительность"
в случае 2: оба month(clothdeliverydate)
и SUM(CONVERT(INT, deliveredqty))
должны быть названы