列「集計関数にもGROUPBY句にも含まれていないため、選択リストでは無効です」


83

B以下のSQLで列を表示したいのですが、クエリに追加すると、次のエラーが発生します。

列T2.B 'は、集計関数にもGROUP BY句にも含まれていないため、選択リストでは無効です。

私のコード:

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

2
GroupBy句が重複してエラーが発生する可能性があります。ここでエラーメッセージを検索すると、これに答える一致がたくさん見つかります。少なくともそれを行うように努力し、エラーメッセージを実際に読むようにしてください。エラーメッセージは、正確な問題を説明するだけでなく、どの列が原因であるかを正確に示します。
ケンホワイト

回答:


150

つまり、このエラーは、SQLServerがグループからどちら Bを選択するか認識しいないことを示しています。

あなたは、ある特定の値(例えば選択したいのいずれかMINSUMまたはAVGあなたが適切な集約関数を使用している場合)を、またはあなたが(を含むすなわち新しい行としてすべての値を選択するBにはGROUP BY、フィールドリスト)。


次のデータを検討してください。

ID AB
1 1 13
1 1 79
1 2 13
1 2 13
1 2 42

クエリ

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

戻ります:

T1
1 2
2 3

これはすべてうまくいっています。

ただし、次の(不正な)クエリを検討してください。これにより、このエラーが発生します。

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

そして、問題を説明するその返されたデータセット:

A T1 B
1 2 13?79?13と79の両方を別々の行として?(13 + 79 = 92)?...?
2 3 13?42?...?

ただし、次の2つのクエリはこれを明確にし、エラーを引き起こしません。

  1. 集計を使用する

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

    戻ります:

    A T1 B
    1 2 92
    2 3 68
    
  2. GROUP BYリストへの列の追加

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

    戻ります:

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

3
この詳細な説明に感謝します-私の質問のいくつかを本当に解決しました。最初の問題で注意が必要なのは、最適なデータセットに対してクエリを実行でき、その例外が発生しないことです。ただし、Bのデータが重複している場合は、その例外が発生します。したがって、lcの例を使用してクエリをより適切に計画します。前もって与えた:)
qgicup 2014

なんて素敵な答えでしょう!
Aerin 2017年

0

この結果、非常識なクエリが必要になる場合があります。

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]

プライマリテーブルはサマリーテーブルであるため、そのプライマリキーは、本当に必要な唯一のグループ化または順序付けを処理します。したがって、GROUP BY句は、クエリパーサーを満たすためだけに存在します。


0

更新とスワップのユースケースはいくつでも使用できます

update Table SET column=(case when is_row_1 then value_2 else value_1 end) where rule_to_match_swap_columns
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.