web-dev-qa-db-ja.com

SQL Server CTEで「 'd'の列2に列が指定されていません」を取得していますか?

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

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

21
Razort4x

[編集]

クエリを書き直そうとしましたが、「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
17
Vikdor

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

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

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

_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
_
7
contactmatt

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

3
sjith

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

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

sum(totalitems) as bkdqty

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

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

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

3
András Ottó

非常に直感的なエラーメッセージ-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)           
 ) 
3
whytheq

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

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

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

1
netandwhich