在SQL Server CTE中出现“未指定'd'的第2列”的错误?

50

我有这个查询,但它没有按照应该的方式工作。

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,Level 16,State 2,Line 1
没有为'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

我得到了:

消息8155,级别16,状态2,第1行
d的列1未指定列。
消息8155,级别16,状态2,第1行
d的列2未指定列。


你还需要知道如何添加净余额吗? - MimiEAM
9个回答

42

你只需要在公共表达式中为聚合列提供一个别名

d as (SELECT 
   duration, 
   sum(totalitems) as sumtotalitems
FROM 
   [DrySoftBranch].[dbo].[mnthItemWiseTotalQty] ('1') AS BkdQty
group by duration
)

谢谢!在许多情况下,聚合表达式会获得默认的列名,这很奇怪。 - tom

35

[编辑]

我尝试重写了你的查询语句,但即使使用你的查询语句,它也只能在将别名与定义'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

1
不行!第一个出现了以下错误: Msg 8155,Level 16,State 2,Line 1 未为“d”的第2列指定列。 Msg 207,Level 16,State 1,Line 4 无效的列名“bkdqty”。 对于第二个,它显示了以下内容: Msg 8155,Level 16,State 2,Line 1 未为“d”的第1列指定列。 Msg 8155,Level 16,State 2,Line 1 未为“d”的第2列指定列。 Msg 207,Level 16,State 1,Line 23 无效的列名“duration”。 Msg 207,Level 16,State 1,Line 4 无效的列名“bkdqty”。 - Razort4x
11
错误在于查询中未对定义“d”的聚合列进行命名。我尝试进行了更正,您可以确认一下吗? - Vikdor
4
太棒了!它成功了!非常感谢! :-) 你是我的救星。 不过,为了让它工作,需要将month(clothdeliverydate) 'duration'这样写,否则它会一直说找不到'duration'列。 - Razort4x
1
我只需要为每个函数使用的列添加别名,甚至是在 RTRIM() 上(SQL 2008)。然后错误就消失了。 - tedi
就是这样了!谢谢! - mattylantz

22

我也有类似的疑问和问题。

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(*)列上出了问题,并提示错误未为第二列指定列

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

1
跟我一样(使用AVG函数),但是在意识到问题所在后,我不小心将“AS AvgValue”添加到表名而不是“列名”。 所以最终我得到了 SELECT Something, Something2, AVG(Value) FROM Orders AS AvgValue。这里看起来非常愚蠢,但是我的SQL格式让它溜了过去,看起来并不是那么明显! - Simon_Weaver
我找了很久才找到这个,谢谢。 - laancelot

9
一个with子句可以通过用逗号分隔它们来引入多个查询名称,但每个列都必须有一个名称
在这种情况下,第二个查询有一个没有列名的列:
 as (SELECT 
               duration, 
               sum(totalitems) --**HERE IS A MISSING NAME**
 FROM ...

这就是全部。


6

因为您正在创建一个表达式,所以必须指定该表的结构,您可以通过以下两种方式实现:

1:在SELECT语句中,您可以使用原始列名称(如第一个示例中),但是对于聚合操作,您必须使用别名(即使名称冲突也是如此)。例如:

sum(totalitems) as bkdqty

2:在表名后面必须指定列名,然后您只需要确保名称的数量应与查询中选择的列数匹配。例如:

d (duration, bkdqty) 
AS (Select.... ) 

使用第二种解决方案,您的两个查询都能够正常工作!


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)           
 ) 

4
只需添加如下别名:
sum(totalitems) as totalitems。

1
显然,正如解析器响应中所述,两种情况都需要列名。在任一版本中,“d”的列都没有命名。
情况1:您的“d”表第2列是未命名的sum(totalitems)duration将保留名称“duration”。
情况2:必须为month(clothdeliverydate)SUM(CONVERT(INT, deliveredqty))都命名。

-1

消息 8155,级别 16,状态 2,行 1 未指定“d”的列 1 的列。 消息 8155,级别 16,状态 2,行 1 未指定“d”的列 2 的列。 答案:

ROUND(AVG(CAST(column_name AS FLOAT)), 2) as column_name


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接