web-dev-qa-db-fra.com

obtenir "Aucune colonne n'a été spécifiée pour la colonne 2 de 'd'" dans le serveur SQL cte?

J'ai cette requête, mais ça ne fonctionne pas comme il se doit,

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

quand je lance ça, je reçois

Msg 8155, niveau 16, état 2, ligne 1
Aucune colonne n'a été spécifiée pour la colonne 2 de 'd'.

Quelqu'un peut-il me dire ce que je fais mal?

Aussi, quand je lance ça,

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

Je reçois

Msg 8155, niveau 16, état 2, ligne 1
Aucune colonne n'a été spécifiée pour la colonne 1 de "d".
Msg 8155, niveau 16, état 2, ligne 1
Aucune colonne n'a été spécifiée pour la colonne 2 de 'd'.

21
Razort4x

[modifier]

J'ai essayé de réécrire votre requête, mais même la vôtre fonctionnera une fois que vous associez des alias aux colonnes agrégées de la requête qui définit "d".


Je pense que vous recherchez ce qui suit:

Premier:

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

Deuxième:

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

Il vous suffit de fournir un alias pour vos colonnes agrégées dans le CTE

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

J'ai eu une requête similaire et un problème similaire.

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

J'ai trouvé que SQL Server s'étouffait dans la colonne COUNT(*) et me donnait l'erreur aucune colonne n'a été spécifiée pour la colonne 2.

Mettre un alias sur la colonne COUNT(*) a résolu le problème.

  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

Ajoutez simplement un nom d'alias comme suit
somme (totalitems) en totalitems.

3
sjith

Parce que vous créez une expression de table, vous devez spécifier la structure de cette table, vous pouvez y parvenir de deux manières:

1: Dans la sélection, vous pouvez utiliser les noms de colonnes d'origine (comme dans votre premier exemple), mais avec les agrégats, vous devez utiliser un alias (également dans les noms en conflit). Comme

sum(totalitems) as bkdqty

2: Vous devez spécifier les noms de colonne juste après le nom du talbe, puis vous devez juste vous assurer que le nombre de noms doit correspondre au nombre de coulms sélectionné dans la requête. Comme:

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

Avec la deuxième solution, vos deux requêtes fonctionneront!

3
András Ottó

Un message d'erreur assez intuitif - il suffit de donner les colonnes en noms d

Passez à ceci

d as 
 (
  select                 
     [duration] = month(clothdeliverydate),                 
     [bkdqty] = SUM(CONVERT(INT, deliveredqty))             
  FROM                 
     barcodetable            
  where                 
     month(clothdeliverydate) is not null                
  group by month(clothdeliverydate)           
 ) 

Ou vous pouvez déclarer explicitement les champs dans la définition du 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

évidemment, comme indiqué dans la réponse de l'analyseur, un nom de colonne est nécessaire pour les deux cas. Dans les deux versions, les colonnes de "d" ne sont pas nommées.

dans le cas 1: votre colonne 2 de d est sum(totalitems) qui n'est pas nommée. duration conservera le nom "durée"

dans le cas 2: month(clothdeliverydate) et SUM(CONVERT(INT, deliveredqty)) doivent être nommés

1
netandwhich