1
votes

L'identificateur en plusieurs parties n'a pas pu être lié clause WITH

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.


0 commentaires

4 Réponses :


1
votes

É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


0 commentaires

1
votes

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


0 commentaires

3
votes
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.

0 commentaires

2
votes

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 ...


1 commentaires

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.