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'.
[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
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
)
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
Ajoutez simplement un nom d'alias comme suit
somme (totalitems) en totalitems.
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!
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)
)
é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