열 "집계 함수 또는 GROUP BY 절에 포함되어 있지 않기 때문에 선택 목록에서 유효하지 않음"


84

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

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

내 코드 :

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

2
Group By 절이 중복되어 오류가 발생할 수 있습니다. 여기에서 오류 메시지를 검색하면 여기에서 이에 대한 답을 찾을 수있는 많은 일치 항목을 찾을 수 있습니다. 정확한 문제를 설명 할뿐만 아니라 어떤 열이 문제를 일으키는 지 정확하게 알려주는 오류 메시지 를 실제로 읽는 것뿐만 아니라 최소한 그렇게하는 데 노력을 기울 이십시오.
Ken White

답변:


153

즉,이 오류는 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
    

3
이 자세한 설명에 감사드립니다-정말 내 질문 중 일부를 해결했습니다. 초기 문제의 까다로운 부분은 최적의 데이터 세트에 대해 쿼리를 실행할 수 있으며 해당 예외가 발생하지 않는다는 것입니다. 그러나 B에 대한 중복 데이터가 있으면 해당 예외가 발생합니다. 따라서 예를 들어 쿼리를 더 잘 계획하십시오. :)
qgicup 2014

이 얼마나 좋은 대답!
Aerin

0

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

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

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

update Table SET column=(case when is_row_1 then value_2 else value_1 end) where rule_to_match_swap_columns
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.