41

このクエリがありますが、正常に機能していません。

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に列が指定されていません。

4

9 に答える 9

33

CTEの集計列のエイリアスを指定する必要があります

d as (SELECT 
   duration, 
   sum(totalitems) as sumtotalitems
FROM 
   [DrySoftBranch].[dbo].[mnthItemWiseTotalQty] ('1') AS BkdQty
group by duration
)
于 2012-08-25T04:23:28.000 に答える
32

[編集]

クエリを書き直そうとしましたが、「d」を定義するクエリの集計列にエイリアスを関連付けると、クエリでも機能します。


私はあなたが以下を探していると思います:

最初の1つ:

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
于 2012-08-25T04:14:47.897 に答える
18

同様のクエリと同様の問題がありました。

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が列を詰まらせていて、列2に列が指定されていませ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
于 2017-03-02T04:02:07.133 に答える
6

あなたはテーブル式を作成しているので、そのテーブルの構造を指定する必要があります。これは2つの方法で実現できます。

1:selectでは(最初の例のように)元の列名を使用できますが、集計では(競合する名前でも)エイリアスを使用する必要があります。好き

sum(totalitems) as bkdqty

2:talbeの名前の後に列名を指定する必要があります。次に、名前の数がクエリで選択された列の数と一致するように注意する必要があります。好き:

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

2番目のソリューションでは、両方のクエリが機能します。

于 2012-08-25T04:37:25.270 に答える
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)           
 ) 
于 2012-08-25T10:49:55.123 に答える
4


totalitemsとしてsum(totalitems)のようにエイリアス名を追加するだけです。

于 2013-01-22T07:34:21.503 に答える
3

単一のwith句は、コンマで区切ることによって複数のクエリ名を導入できますが、すべての列に名前を付ける必要があります

この場合、2番目のクエリには1つもない列があります。

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

それで全部です。

于 2021-08-15T01:21:56.353 に答える
1

明らかに、パーサーの応答で述べられているように、どちらの場合も列名が必要です。どちらのバージョンでも、「d」の列には名前が付けられていません。

ケース1の場合:dの列2はsum(totalitems)名前が付けられていません。duration「duration」という名前を保持します

ケース2の場合:両方month(clothdeliverydate)SUM(CONVERT(INT, deliveredqty))名前を付ける必要があります

于 2014-03-24T12:28:18.130 に答える
-1

メッセージ8155、レベル16、状態2、行1'd'の列1に列が指定されていません。メッセージ8155、レベル16、状態2、行1「d」の列2に列が指定されていません。答え:

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

于 2020-08-25T06:41:06.050 に答える