получение " столбец не был указан для столбца 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)           
 ) 

просто добавьте псевдоним следующим образом
сумма(totalitems) как totalitems.


очевидно, как указано в ответе анализатора, имя столбца необходимо для обоих случаев. В обеих версиях столбцы "d"не называются.

в случае 1: Ваш столбец 2 из d sum(totalitems), который не назван. duration сохранит название"duration"

в случае 2: обе month(clothdeliverydate) и SUM(CONVERT(INT, deliveredqty)) должны быть названы