2012-10-19 6 views
0

J'ai la requête SQL suivante:sous requête SQL avec le groupe par

SELECT 
kvknum.cd_hfdrelnr, 
kvknum.cd_kvkanum, 
    relName.cd_hfdrelnr 
FROM 
(
    SELECT 
     cd_hfdrelnr, 
     cd_kvkanum 

FROM er_105 
WHERE cd_kvkanum IN 
(
    SELECT cd_kvkanum 
    FROM er_105 
    GROUP BY cd_kvkanum 
    HAVING COUNT(*) > 1 
) 
AND cd_kvkanum != '' 
ORDER BY cd_kvkanum 
) AS kvknum 
LEFT OUTER JOIN 
(
    SELECT 
     cd_hfdrelnr, 
     cd_relnaam 
    FROM er_101 
) AS relName 
ON kvknum.cd_hfdrelnr = relName.cd_hfdrelnr 

La fonction GROUP BY n'est pas autorisé et il est nécessaire pour que les mêmes cd_kvkanum valeurs sont affichées ensemble sous l'autre, est-il un travail autour pour ceci ou comment est-ce possible?

Après erreur vient avec elle:

« Msg 1033, niveau 15, état 1, ligne 21 La clause ORDER BY est invalide dans les vues, fonctions en ligne, les tables dérivées, les sous-requêtes et expressions de table commune, à moins que TOP ou FOR XML est également spécifié Msg 156, niveau 15, état 1, ligne 28 Syntaxe incorrecte près du mot clé 'AS'. "

quand je lance la requête suivante:

SELECT 
    cd_hfdrelnr, 
    cd_kvkanum 

FROM er_105 
WHERE cd_kvkanum IN 
(
    SELECT cd_kvkanum 
    FROM er_105 
    GROUP BY cd_kvkanum 
    HAVING COUNT(*) > 1 
) 
AND cd_kvkanum != '' 
ORDER BY cd_kvkanum 

(sous-requête d'abord la jointure) ressembleront les résultats:
1235-123
4652-123
8569-1234
4985-1234

Bien que je veux ajouter cd_relnaam à la liste de résultats, quand il suffit d'utiliser un JOIN sur la requête mes résultats sont vides ...

quelqu'un sait ce que je fais mal?

+2

Exemple de données? Résultat attendu? Ce que vous entendez par "bien que le groupe par fonction ne soit pas autorisé". Merci d'essayer d'ajouter un peu de contexte à la question. Nous ne faisons pas attention aux lecteurs. –

+0

Mis à jour avec plus d'informations :) –

Répondre

1

Ce n'est pas une réponse complète, mais, si je ne me trompe pas, votre requête peut être écrite beaucoup plus simple. 90% des erreurs surviennent lorsque les gens écrivent des requêtes très complexes lorsqu'ils peuvent écrire des requêtes simples. La simplicité est la clé du succès :) Je vais modifier la réponse quand vous avez donné plus question exacte

SELECT 
    kvknum.cd_hfdrelnr, 
    kvknum.cd_kvkanum, 
    relName.cd_hfdrelnr 
FROM er_105 as kvknum 
    LEFT OUTER JOIN er_101 as relName on relName.cd_hfdrelnr = kvknum.cd_hfdrelnr 
where 
    kvknum.cd_kvkanum IN 
    (
     SELECT cd_kvkanum 
     FROM er_105 
     GROUP BY cd_kvkanum 
     HAVING COUNT(*) > 1 
    ) AND 
    cd_kvkanum != '' 
+0

Avec la requête que vous avez créé le problème est les résultats ne sont pas "regroupés par" les résultats correspondants par exemple vous: id - anumer –

+0

pourriez-vous s'il vous plaît ajouter des exemples de données (2-3 enregistrements de er_105 , er_101 table) et le résultat souhaité? –

1

Le problème ici est pas tant avec le GROUP BY, il est en fait la ORDER BY, vous ne pouvez pas mettez-le dans une sous-requête, il doit être sur la requête de vos parents. Aussi, je crois savoir que vous voulez les enregistrements de er_105 où cd_kvkanum se produit plus d'une fois et n'est pas vide, mais vous ne voulez pas agréger.

SELECT er_105.cd_hfdrelnr, 
     er_105.cd_kvkanum, 
     er_101.cd_relnaam 
    FROM er_105 
    JOIN (SELECT cd_kvkanum,COUNT(cd_kvkanum) 
      FROM er_105 
     WHERE cd_kvkanum != '' 
     GROUP BY cd_kvkanum 
     HAVING COUNT(cd_kvkanum) > 1 
     ) kvknum ON er_105.cd_kvkanum = kvknum.cd_kvkanum 
LEFT JOIN er_101 ON er_105.cd_hfdrelnr = er_101.cd_hfdrelnr 
ORDER BY er_105.cd_kvkanum 

Habituellement, il est mieux quand vous voulez compter les occurences de quelque chose, de faire quelque chose SELECT COUNT (PrimaryKey) plutôt que COUNT (*). Le * Makes SQL fait l'étape supplémentaire de comprendre ce que * représente. Et bien sûr, comme avec de nombreuses requêtes sur stackoverflow, il y a toujours un moyen plus simple de l'écrire;)