【问题标题】:getting "No column was specified for column 2 of 'd'" in sql server cte?在sql server cte中得到“没有为'd'的第2列指定列”?
【发布时间】:2012-08-20 14:08:00
【问题描述】:

我有这个查询,但它没有正常工作,

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

当我运行它时,我得到了

消息 8155,第 16 级,状态 2,第 1 行
没有为“d”的第 2 列指定任何列。

谁能告诉我我做错了什么?

另外,当我运行这个时,

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 列指定任何列。

【问题讨论】:

  • 你还需要知道如何拥有 netBalance 吗?

标签: sql sql-server group-by common-table-expression calculated-columns


【解决方案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

【讨论】:

  • 不!这不起作用,第一个显示Msg 8155, Level 16, State 2, Line 1 No column was specified for column 2 of 'd'. Msg 207, Level 16, State 1, Line 4 Invalid column name 'bkdqty'. 第二个显示Msg 8155, Level 16, State 2, Line 1 No column was specified for column 1 of 'd'. Msg 8155, Level 16, State 2, Line 1 No column was specified for column 2 of 'd'. Msg 207, Level 16, State 1, Line 23 Invalid column name 'duration'. Msg 207, Level 16, State 1, Line 4 Invalid column name 'bkdqty'.
  • 错误是关于在两个地方都定义了“d”的查询中没有命名聚合列。我试图纠正它,你能验证一下吗?
  • 去他妈的,伙计!有效!多谢! :-) 你是生命的救星。有一件事,虽然它会是 month(clothdeliverydate) 'duration' 才能工作,否则它一直说找不到列持续时间。
  • 我只需要为使用函数的所有列添加别名。即使在RTRIM() (SQL 2008) 上。并且错误消失了。
【解决方案2】:

您只需为 CTE 中的聚合列提供别名

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

【讨论】:

    【解决方案3】:

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

    1:在选择中,您可以使用原始列名(如在第一个示例中),但对于聚合,您必须使用别名(也在冲突的名称中)。喜欢

    sum(totalitems) as bkdqty
    

    2:您需要在 talbe 名称之后指定列名,然后您只需要注意名称的计数应该与查询中选择的库仑数相匹配。喜欢:

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

    使用第二种解决方案,您的两个查询都可以工作!

    【讨论】:

      【解决方案4】:

      一个很直观的错误信息——只需要给出 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)           
       ) 
      

      【讨论】:

        【解决方案5】:

        只需添加一个别名如下
        总和(总数)作为总数。

        【讨论】:

          【解决方案6】:

          显然,正如解析器响应中所述,两种情况都需要列名。在这两个版本中,“d”的列都没有命名。

          在第 1 种情况下:您的 d 的第 2 列是 sum(totalitems) 未命名。 duration 将保留名称“duration”

          情况 2:month(clothdeliverydate)SUM(CONVERT(INT, deliveredqty)) 都必须命名

          【讨论】:

            【解决方案7】:

            我有类似的查询和类似的问题。

            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(*) 列上阻塞,并给我错误No column was specified for column 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
            

            【讨论】:

            • 对我来说也是这样(AVG 功能很好),但在意识到问题出在后,我不小心将AS AvgValue 添加到了 table 名称而不是“列”中。所以我最终得到了SELECT Something, Something2, AVG(Value) FROM Orders AS AvgValue。在这里看起来超级愚蠢,但是我的 SQL 格式化方式偷偷通过并且看起来并不那么明显!
            • 我看了很久才找到这个,谢谢。
            【解决方案8】:

            消息 8155,第 16 级,状态 2,第 1 行 没有为“d”的第 1 列指定任何列。 消息 8155,第 16 层,状态 2,第 1 行 没有为“d”的第 2 列指定任何列。 答案:

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

            【讨论】:

              【解决方案9】:

              单个 with 子句可以引入多个查询名称,方法是用逗号分隔它们但每列必须有一个名称

              在这种情况下,第二个查询有一列没有:

               as (SELECT 
                             duration, 
                             sum(totalitems) --**HERE IS A MISSING NAME**
               FROM ...
              

              就是这样。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-07-03
                • 2021-10-31
                • 1970-01-01
                • 1970-01-01
                • 2021-07-10
                • 1970-01-01
                相关资源
                最近更新 更多