以下のSQLでB
列を表示したいのですが、クエリに追加すると次のエラーが表示されます。
列T2.B 'は、集計関数またはGROUP BY句のいずれにも含まれていないため、選択リストでは無効です。
私のコード:
SELECT A, COUNT(B) as T1, B
FROM T2
WHERE ID=1
GROUP BY A
言い換えれば、このエラーは、SQL Serverがグループから選択するwhichB
を知らないことを示しています。
1つの特定の値(MIN
、SUM
、AVG
など)を選択する場合(適切な集約関数を使用する場合)、またはすべての値を新しい行として選択する(つまり、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つのクエリによりこれが明確になり、エラーは発生しません。
集計を使用する
SELECT A, COUNT(B) AS T1, SUM(B) AS B
FROM T2
GROUP BY A
戻ります:
A T1 B 1 2 92 2 3 68
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
必要に応じて、更新および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句はクエリパーサーを満たすためだけに存在します。