web-dev-qa-db-ja.com

SQL Server-「集計関数またはGROUP BY句に含まれていないため、選択リストの列が無効です」

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

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

私のコード:

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

言い換えれば、このエラーは、SQL Serverがグループから選択するwhichBを知らないことを示しています。

1つの特定の値(MINSUMAVGなど)を選択する場合(適切な集約関数を使用する場合)、またはすべての値を新しい行として選択する(つまり、GROUP BYフィールドリストにBを含める) 。


次のデータを考慮してください。

 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

戻ります:

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

必要に応じて、更新およびSWAPでケースを使用できます

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

この結果、かなり正気に見えないクエリが必要になる場合があります。 g。、

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
David A. Gray