B以下のSQLで列を表示したいのですが、クエリに追加すると、次のエラーが発生します。
列T2.B 'は、集計関数にもGROUP BY句にも含まれていないため、選択リストでは無効です。
私のコード:
SELECT A, COUNT(B) as T1, B 
FROM T2 
WHERE ID=1 
GROUP BY A 
    B以下のSQLで列を表示したいのですが、クエリに追加すると、次のエラーが発生します。
列T2.B 'は、集計関数にもGROUP BY句にも含まれていないため、選択リストでは無効です。
私のコード:
SELECT A, COUNT(B) as T1, B 
FROM T2 
WHERE ID=1 
GROUP BY A 
    回答:
つまり、このエラーは、SQLServerがグループからどちら Bを選択するかを認識していないことを示しています。
あなたは、ある特定の値(例えば選択したいのいずれかMIN、SUMまたは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つのクエリはこれを明確にし、エラーを引き起こしません。
集計を使用する
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
この結果、非常識なクエリが必要になる場合があります。
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句は、クエリパーサーを満たすためだけに存在します。
更新とスワップのユースケースはいくつでも使用できます
update Table SET column=(case when is_row_1 then value_2 else value_1 end) where rule_to_match_swap_columns