J'ai calculé le TOP 10 total cumulé d'une table et je veux maintenant l'obtenir en pourcentage pour un diagramme de pareto, j'ai le code suivant:
The multi-part identifier "totAlarms.cnt" could not be bound.
Lorsque je veux utiliser totAlarms.cnt pour calculer le pourcentage en cours, j'obtiens l'erreur suivante:
WITH
CTE as
(
SELECT
[nWordNr] as W,
[nBitNr] as B,
SUM([tmTotals]) as total,
COUNT(*) as Amount
FROM Messages_History
GROUP BY nWordNr, nBitNr
),
totAlarms as
(
select
count([nWordNr]) as cnt
FROM Messages_History
)
SELECT TOP 10 *,
SUM(total) OVER (ORDER BY total desc) * 1.0 / totAlarms.cnt as Running
FROM CTE
ORDER BY total desc
Comment puis-je utiliser totAlarms .cnt pour calculer le pourcentage courant.
4 Réponses :
Étant donné que le nombre n'est qu'une valeur unique, je le capturerais dans une variable scalaire:
DECLARE @totAlarms_cnt INT = (
SELECT COUNT([nWordNr]) as cnt
FROM Messages_History
)
;
WITH
CTE as
(
SELECT
[nWordNr] as W,
[nBitNr] as B,
SUM([tmTotals]) as total,
COUNT(*) as Amount
FROM Messages_History
GROUP BY nWordNr, nBitNr
)
SELECT TOP 10 *,
SUM(total) OVER (ORDER BY total desc) * 1.0 / @totAlarms_cnt as Running
FROM CTE
ORDER BY total desc
Au lieu d'écrire des sous-CTE, essayez de créer une variable et de stocker la valeur et utilisez comme ci-dessous
declare @nWordNr int select @nWordNr=count(nWordNr) FROM Messages_History ;WITH CTE as ( SELECT [nWordNr] as W, [nBitNr] as B, SUM([tmTotals]) as total, COUNT(*) as Amount FROM Messages_History GROUP BY nWordNr, nBitNr )--, --totAlarms as --( --select --count([nWordNr]) as cnt --FROM Messages_History --) SELECT TOP 10 *, SUM(total) OVER (ORDER BY total desc) * 1.0 / @nWordNr as Running FROM CTE ORDER BY total desc
WITH
CTE as
(
SELECT
[nWordNr] as W,
[nBitNr] as B,
SUM([tmTotals]) as total,
COUNT(*) as Amount
FROM Messages_History
GROUP BY nWordNr, nBitNr
),
totAlarms as
(
select
count([nWordNr]) as cnt
FROM Messages_History
)
SELECT TOP 10 *,
SUM(total) OVER (ORDER BY total desc) * 1.0 / totAlarms.cnt as Running
FROM CTE,totAlarms
ORDER BY total desc
With the help of cross join you can achieve it.
The multi-part identifier "totAlarms.cnt" could not be bound. This error was showing becoz you are not using totAlarms (CTE table) in join or from.
Les CTE ne sont pas automatiquement inclus dans la requête jointe, vous devez les mentionner dans une clause FROM ou JOIN .
Votre requête actuelle est de la forme :
WITH CTE AS ( ... ), totAlarms AS ( ... ) SELECT ... FROM CTE, totAlarms ORDER BY ...
Ainsi, seul CTE est visible dans la clause SELECT . totAlarms est défini mais jamais utilisé - comme créer un VIEW mais ne pas écrire de requêtes qui le référencent.
Puisque vos deux CTE sont indépendants, vous avez besoin pour les CROSS JOIN , en leur donnant la forme suivante:
WITH CTE AS ( ... ), totAlarms AS ( ... ) SELECT ... FROM CTE CROSS JOIN totAlarms ORDER BY ...
Ou en utilisant l'opérateur , , qui est en fait une jointure croisée :
WITH CTE AS ( ... ), totAlarms AS ( ... ) SELECT ... FROM CTE ORDER BY ...
Toutes les réponses fonctionnent, mais la vôtre est celle qui a le plus expliqué, alors j'ai choisi celle-ci comme la meilleure.