0
votes

Récupération des enregistrements d'une autre colonne de table

J'ai créé une vue contenant plusieurs colonnes. J'ai besoin de récupérer des données à partir d'une table externe. entrez la description de l'image ici entrez la description de l'image ici

cte4 as (
SELECT *,
case 
    when roadName=roadNameUserData then sec1
else 'x' 
end as roadCrossSection1

FROM dbo.roadSectionAndPavementUserData,cte3
    )

--"roadName" is from cte computed column view
--"roadNameUserData" is from other table("dbo.roadSectionAndPavementUserData") where records are to be extracted
--sec1 is the column in table "dbo.roadSectionAndPavementUserData" where the results coming from 



-----final view
SELECT roadName,
sum(roadLength) as sumRoadLength,roadCrossSection1


FROM cte4 
group by roadName
order by roadName

Lorsque j'exécute la requête, l'erreur suivante s'affiche

"La colonne 'cte4.roadCrossSection1' n'est pas valide dans la liste de sélection car il n'est contenu ni dans une fonction d'agrégation ni dans GROUP BY clause. "

 enter image description here

Voici le résultat après l'ajout d'une instruction groupby supplémentaire. Les enregistrements corrects sont les valeurs inférieures de sumRoadLength.


0 commentaires

3 Réponses :


1
votes

Vous devez regrouper par roadCrossSection1 ainsi que

SELECT roadName, sum(roadLength) as sumRoadLength
FROM cte4 
group by roadName 
order by roadName

Mis à jour

SELECT roadName, roadCrossSection1,
               sum(roadLength) as sumRoadLength
FROM cte4 
group by roadName, roadCrossSection1
order by roadName, roadCrossSection1


8 commentaires

J'ai essayé votre solution proposée, cela a fonctionné mais cela crée des enregistrements en double. À l'origine, j'ai 442 lignes, mais après avoir appliqué un groupby supplémentaire, il est devenu 884 où les autres enregistrements sont nuls. Les deuxièmes disques sont sortis du bon résultat.


Veuillez capturer un résultat d'image puis me le donne. Probablement, les valeurs roadCrossSection1 et roadName sont différentes. A l'avenir plus, le cte4 rejoint sans condition FROM dbo.roadSectionAndPavementUserData, cte3


À quoi ressemble CTE3 ?


J'ai posté dans ma question initiale l'image du résultat récent. J'ai observé que le résultat correct devrait être les valeurs moindres des enregistrements roadName et les valeurs qui ne sont pas nulles.


Vous devez supprimer roadCrossSection1 .


Je supprime comme vous l'avez indiqué ne change rien. J'ai encore des enregistrements en double de nulle part.


supprimer également dans la clause group by . Cela ressemble beaucoup à group by roadName


Je viens de mettre à jour ma réponse, veuillez jeter un œil à @Vincent



0
votes

L'erreur indique que si vous voulez roadCrossSection1 dans la clause select, vous devez soit appliquer une fonction d'agrégation, par exemple MIN, Max, Sum, Avg sur roadCrossSection1, soit la placer dans une clause group by car roadCrossSection1 peut avoir plusieurs valeurs pour le même nom de route mais en même temps, vous évaluez une seule valeur pour roadLength en appelant la fonction d'agrégation sur roadLength


0 commentaires

1
votes

De votre commentaire:

J'ai observé que le résultat correct devrait être les valeurs inférieures de enregistrements roadName et les valeurs qui ne sont pas nulles

Je pense que vous avez besoin d'une agrégation conditionnelle:

SELECT roadName,
  sum(case when roadCrossSection1 is not null then roadLength end) as sumRoadLength,
  max(roadCrossSection1) roadCrossSection1
FROM cte4 
group by roadName
order by roadName


0 commentaires