получение " столбец не был указан для столбца 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 " столбец не указан.
7 ответов
[edit]
Я попытался переписать ваш запрос, но даже Ваш будет работать, как только вы свяжете псевдонимы с агрегатными столбцами в запросе, который определяет "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
вам просто нужно предоставить псевдоним для ваших агрегатных столбцов в CTE
d as (SELECT
duration,
sum(totalitems) as sumtotalitems
FROM
[DrySoftBranch].[dbo].[mnthItemWiseTotalQty] ('1') AS BkdQty
group by duration
)
поскольку вы создаете табличное выражение, Вы должны указать структуру этой таблицы, вы можете достичь этого двумя способами:
1: в select вы можете использовать исходные имена столбцов (как в первом примере), но с агрегатами вы должны использовать псевдоним (также в конфликтующих именах). Как
sum(totalitems) as bkdqty
2: вам нужно указать имена столбцов rigth после имени talbe, а затем вам просто нужно позаботиться о том, чтобы количество имен должно соответствовать в запросе было выбрано количество coulms. Например:
d (duration, bkdqty)
AS (Select.... )
со вторым решением оба ваших запроса будут работать!
у меня был аналогичный запрос и аналогичная проблема.
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
довольно интуитивное сообщение об ошибке - просто нужно дать столбцы в 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)
)
очевидно, как указано в ответе анализатора, имя столбца необходимо для обоих случаев. В обеих версиях столбцы "d"не называются.
в случае 1: Ваш столбец 2 из d sum(totalitems)
, который не назван. duration
сохранит название"duration"
в случае 2: обе month(clothdeliverydate)
и SUM(CONVERT(INT, deliveredqty))
должны быть названы