2013-08-15 98 views
45

Tôi muốn hiển thị cột B trong SQL dưới đây, nhưng khi tôi thêm nó vào truy vấn, nó mang lại cho tôi các lỗi sau:Cột "không hợp lệ trong danh sách lựa chọn vì nó không được chứa trong hàm tổng hợp hoặc mệnh đề GROUP BY"

Column T2.B' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

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 với [Điều khoản theo nhóm gây ra lỗi] (http://stackoverflow.com/questions/16314836/group-by-clause-causing-error). Nếu bạn tìm kiếm ở đây trên thông báo lỗi của bạn, bạn sẽ tìm thấy rất nhiều trận đấu ở đây mà có thể đã trả lời điều này cho bạn. Xin vui lòng ít nhất là đặt nỗ lực vào đó, cũng như trong thực tế * đọc * thông báo lỗi, không chỉ mô tả vấn đề chính xác mà còn cho bạn biết chính xác cột nào đang gây ra nó. –

+0

Bản sao có thể có của [Lý do cho cột không hợp lệ trong danh sách lựa chọn vì nó không được chứa trong hàm tổng hợp hoặc mệnh đề GROUP BY] (http://stackoverflow.com/questions/13999817/reason-for-column-is -invalid-in-the-select-list-vì-nó-là-không-chứa-in-e) – blo0p3r

Trả lời

91

Đặ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, SUM, hoặ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 B trong GROUP BY danh sách trường).


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

 
ID A B 
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 xem xét như sau (bất hợp pháp) truy vấn, mà sẽ tạo ra lỗi này:

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

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

 
A T1 B 
1 2 13? 79? Both 13 and 79 as separate rows? (13+79=92)? ...? 
2 3 13? 42? ...? 

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

  1. Sử dụng một tổng

    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 danh sách GROUP BY

    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 
    
+1

cảm ơn lời giải thích chi tiết này - đã giải quyết 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, tốt hơn lập kế hoạch truy vấn của bạn với các ví dụ mà lc. đã trả trước :) – qgicup

+0

một câu trả lời hay ho !! – Aaron

0

Hậu quả của việc này là bạn có thể cần một truy vấn khá điên rồ, e. g.,

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à bảng tóm tắt, khóa chính của nó chỉ xử lý nhóm hoặc đặt hàng thật 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.