Nice programing

SQL Server- "집계 함수 또는 GROUP BY 절에 포함되어 있지 않으므로 선택 목록에서 유효하지 않음"열

nicepro 2020. 10. 29. 19:58
반응형

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


You can use case in update and SWAP as many as you want

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

참고URL : https://stackoverflow.com/questions/18258704/sql-server-column-invalid-in-the-select-list-because-it-is-not-contained-in-e

반응형