Подтвердить что ты не робот

Получение "Нет столбца для столбца 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' не указан столбец.

4b9b3361

Ответ 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)) должны быть названы