[sql-server] 열 “집계 함수 또는 GROUP BY 절에 포함되어 있지 않기 때문에 선택 목록에서 유효하지 않음”

B아래 SQL에 열을 표시하고 싶지만 쿼리에 추가하면 다음 오류가 발생합니다.

열 T2.B ‘는 집계 함수 또는 GROUP BY 절에 포함되어 있지 않으므로 선택 목록에서 유효하지 않습니다.

내 코드 :

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



답변

즉,이 오류는 SQL Server가 그룹에서 선택할 항목을 모른다 B 것을 나타냅니다.

어느 쪽이든 당신은 하나 개의 특정 값을 선택합니다 (예 : 원하는 MIN, SUM또는 AVG적절한 집계 함수를)하는 경우에 당신이 사용하는 것이하거나 (예를 포함하여 새로운 행으로 모든 값을 선택합니다 B에서 GROUP BY필드 목록을).


다음 데이터를 고려하십시오.

ID AB
1 1 13
1 1 79
1 2 13
1 2 13
12 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? ...?

그러나 다음 두 쿼리는이를 명확하게하며 오류를 발생시키지 않습니다.

  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
    


답변

그 결과 다소 미친 것처럼 보이는 쿼리가 필요할 수 있습니다. 예 :

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 절은 쿼리 구문 분석기를 만족시키기 위해서만 존재합니다.


답변

업데이트 및 SWAP에서 원하는만큼 케이스를 사용할 수 있습니다.

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


답변