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
답변:
즉,이 오류는 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? ...?
그러나 다음 두 쿼리는이를 명확하게하며 오류를 발생시키지 않습니다.
집계 사용
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 절은 쿼리 구문 분석기를 만족시키기 위해서만 존재합니다.
업데이트 및 SWAP에서 원하는만큼 케이스를 사용할 수 있습니다.
update Table SET column=(case when is_row_1 then value_2 else value_1 end) where rule_to_match_swap_columns