Cột "không hợp lệ trong danh sách chọn vì nó không được chứa trong hàm tổng hợp hoặc mệnh đề GROUP BY"


83

Tôi muốn hiển thị cột Btrong SQL bên dưới của mình, nhưng khi tôi thêm nó vào truy vấn, nó cho tôi lỗi sau:

Cột T2.B 'không hợp lệ trong danh sách lựa chọn vì nó không có trong hàm tổng hợp hoặc mệnh đề GROUP BY.

Mã của tôi:

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

2
có thể trùng lặp mệnh đề Group By gây ra lỗi . Nếu bạn tìm kiếm ở đây trên thông báo lỗi của mình, bạn sẽ tìm thấy nhiều kết quả phù hợp ở đây có thể trả lời điều này cho bạn. Ít nhất hãy nỗ lực thực hiện điều đó, cũng như thực sự đọc thông báo lỗi, thông báo này không chỉ mô tả chính xác vấn đề mà còn cho bạn biết chính xác cột nào đang gây ra nó.
Ken White

Câu trả lời:


150

Đặt nói cách khác, lỗi này là nói cho bạn rằng SQL Server không biết B để lựa chọn từ nhóm.

Hoặc bạn muốn chọn một giá trị cụ thể (ví dụ như MIN, SUMhoặc AVG) trong trường hợp này bạn sẽ sử dụng hàm tổng hợp thích hợp, hoặc bạn muốn chọn tất cả các giá trị như một hàng mới (tức là bao gồm Btrong GROUP BYdanh sách trường).


Hãy xem xét các dữ liệu sau:

ID AB
1 1 13
1 1 79
1 2 13
1 2 13
1 2 42

Truy vấn

SELECT A, COUNT(B) AS T1 
FROM T2 
GROUP BY A

sẽ trở lại:

A T1
1 2
2 3

đó là tất cả tốt và tốt.

Tuy nhiên, hãy xem xét truy vấn (bất hợp pháp) sau, truy vấn sẽ tạo ra lỗi này:

SELECT A, COUNT(B) AS T1, B 
FROM T2 
GROUP BY A

Và tập dữ liệu trả về của nó minh họa vấn đề:

A T1 B
1 2 13? 79? Cả 13 và 79 là hàng riêng biệt? (13 + 79 = 92)? ...?
2 3 13? 42? ...?

Tuy nhiên, hai truy vấn sau làm rõ điều này và sẽ không gây ra lỗi:

  1. Sử dụng tổng hợp

    SELECT A, COUNT(B) AS T1, SUM(B) AS B
    FROM T2
    GROUP BY A
    

    sẽ trở lại:

    A T1 B
    1 2 92
    2 3 68
    
  2. Thêm cột vào GROUP BYdanh sách

    SELECT A, COUNT(B) AS T1, B
    FROM T2
    GROUP BY A, B
    

    sẽ trở lại:

    A T1 B
    1 1 13
    1 1 79
    2 2 13
    2 1 42
    

3
cảm ơn vì lời giải thích chi tiết này - thực sự đã giải quyết được một số câu hỏi của tôi. phần khó khăn với vấn đề ban đầu là bạn có thể chạy truy vấn trên một số tập dữ liệu tối ưu và bạn sẽ không nhận được ngoại lệ đó. nhưng khi bạn có một số dữ liệu trùng lặp cho B, bạn sẽ nhận được ngoại lệ đó. Vì vậy, lập kế hoạch tốt hơn cho truy vấn của bạn với các ví dụ mà lc. đã trả trước :)
qgicup

thật là một câu trả lời hay !!
Aerin

0

Hệ quả của việc này là bạn có thể cần một truy vấn trông khá điên rồ, ví dụ:

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]

Vì bảng chính là một bảng tóm tắt, khóa chính của nó xử lý việc nhóm hoặc sắp xếp duy nhất thực sự cần thiết. Do đó, mệnh đề GROUP BY chỉ tồn tại để đáp ứng trình phân tích cú pháp truy vấn.


0

Bạn có thể sử dụng trường hợp trong cập nhật và SWAP bao nhiêu tùy thích

update Table SET column=(case when is_row_1 then value_2 else value_1 end) where rule_to_match_swap_columns
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.