100 votes

Colonne "invalide dans la liste de sélection car elle n'est pas contenue dans une fonction d'agrégation ou dans la clause GROUP BY".

Je voudrais afficher la colonne B dans mon SQL ci-dessous, mais lorsque je l'ajoute à la requête, il me donne l'erreur suivante :

La colonne T2.B' n'est pas valide dans la liste de sélection parce qu'elle n'est pas contenue dans l'un des éléments suivants fonction d'agrégation ou dans la clause GROUP BY.

Mon code :

SELECT A, COUNT(B) as T1, B 
FROM T2 
WHERE ID=1 
GROUP BY A

183voto

lc. Points 50297

En d'autres termes, cette erreur vous indique que le serveur SQL ne connaît pas le nom de l'utilisateur. dont B pour choisir dans le groupe.

Soit vous souhaitez sélectionner une valeur spécifique (par exemple, la valeur de l'option MIN , SUM ou AVG ), auquel cas vous utiliserez la fonction d'agrégation appropriée, ou vous voulez sélectionner chaque valeur comme une nouvelle ligne (c'est-à-dire en incluant B dans le GROUP BY liste de champs).


Considérons les données suivantes :

ID  A   B
1   1  13
1   1  79
1   2  13
1   2  13
1   2  42

La requête

SELECT A, COUNT(B) AS T1 
FROM T2 
GROUP BY A

reviendrait :

A  T1
1  2
2  3

ce qui est très bien.

Cependant, considérez la requête (illégale) suivante, qui produirait cette erreur :

SELECT A, COUNT(B) AS T1, B 
FROM T2 
GROUP BY A

Et son jeu de données retournées illustrant le problème :

A  T1  B
1  2   13? 79? Both 13 and 79 as separate rows? (13+79=92)? ...?
2  3   13? 42? ...?

Cependant, les deux requêtes suivantes rendent cela clair, et ne causeront pas l'erreur :

  1. Utilisation d'un agrégat

    SELECT A, COUNT(B) AS T1, SUM(B) AS B
    FROM T2
    GROUP BY A

    reviendrait :

    A  T1  B
    1  2   92
    2  3   68
  2. L'ajout de la colonne au GROUP BY liste

    SELECT A, COUNT(B) AS T1, B
    FROM T2
    GROUP BY A, B

    reviendrait :

    A  T1  B
    1  1   13
    1  1   79
    2  2   13
    2  1   42

1voto

Viswanath L Points 3173

Vous pouvez utiliser le cas dans la mise à jour et SWAP autant que vous le souhaitez.

update Table SET column=(case when is_row_1 then value_2 else value_1 end) where rule_to_match_swap_columns

0voto

user3079037 Points 1

La conséquence de ceci est que vous pouvez avoir besoin d'une requête d'apparence plutôt insensée, par exemple,

SELECT [dbo].[tblTimeSheetExportFiles].[lngRecordID]            AS lngRecordID
          ,[dbo].[tblTimeSheetExportFiles].[vcrSourceWorkbookName]  AS vcrSourceWorkbookName
          ,[dbo].[tblTimeSheetExportFiles].[vcrImportFileName]      AS vcrImportFileName
          ,[dbo].[tblTimeSheetExportFiles].[dtmLastWriteTime]       AS dtmLastWriteTime
          ,[dbo].[tblTimeSheetExportFiles].[lngNRecords]            AS lngNRecords
          ,[dbo].[tblTimeSheetExportFiles].[lngSizeOnDisk]          AS lngSizeOnDisk
          ,[dbo].[tblTimeSheetExportFiles].[lngLastIdentity]        AS lngLastIdentity
          ,[dbo].[tblTimeSheetExportFiles].[dtmImportCompletedTime] AS dtmImportCompletedTime
          ,MIN ( [tblTimeRecords].[dtmActivity_Date] )              AS dtmPeriodFirstWorkDate
          ,MAX ( [tblTimeRecords].[dtmActivity_Date] )              AS dtmPeriodLastWorkDate
          ,SUM ( [tblTimeRecords].[decMan_Hours_Actual] )           AS decHoursWorked
          ,SUM ( [tblTimeRecords].[decAdjusted_Hours] )             AS decHoursBilled
      FROM [dbo].[tblTimeSheetExportFiles]
      LEFT JOIN   [dbo].[tblTimeRecords]
              ON  [dbo].[tblTimeSheetExportFiles].[lngRecordID] = [dbo].[tblTimeRecords].[lngTimeSheetExportFile]
        GROUP BY  [dbo].[tblTimeSheetExportFiles].[lngRecordID]
                 ,[dbo].[tblTimeSheetExportFiles].[vcrSourceWorkbookName]
                 ,[dbo].[tblTimeSheetExportFiles].[vcrImportFileName]
                 ,[dbo].[tblTimeSheetExportFiles].[dtmLastWriteTime]
                 ,[dbo].[tblTimeSheetExportFiles].[lngNRecords]
                 ,[dbo].[tblTimeSheetExportFiles].[lngSizeOnDisk]
                 ,[dbo].[tblTimeSheetExportFiles].[lngLastIdentity]
                 ,[dbo].[tblTimeSheetExportFiles].[dtmImportCompletedTime]

Comme la table primaire est une table récapitulative, sa clé primaire gère le seul regroupement ou ordonnancement qui est vraiment nécessaire. Par conséquent, la clause GROUP BY existe uniquement pour satisfaire l'analyseur syntaxique de la requête.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X