2013-05-15 22 views
10

Tôi có một quy trình được lưu trữ trong đó tôi đang cố gắng chọn tất cả các cột trong bảng Bảng 1. Có một bảng khác sử dụng khóa chính Table1 làm khóa ngoài. Tôi muốn đếm số lượng các bản ghi trong bảng này chính nước ngoài với điều đó chọn như thế này:Lấy số lượng bản ghi trong bảng con bằng cách sử dụng câu lệnh chọn

SELECT *, count(*) VacancyCount 
    FROM Table1 hc 
    LEFT JOIN Table2 hv 
    on hc.CompanyID = hv.CompanyID 
    WHERE hc.Deleted = 0 
    group by hc.CompanyID 
    ORDER BY NameLang1 

nhưng nó mang lại cho lỗi:

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

Xin gợi ý làm thế nào để sửa lỗi này?

Trả lời

21

Vui lòng thử:

select 
    *, 
    (select COUNT(*) from Table2 hv where hv.CompanyID=hc.CompanyID) VacancyCount 
from Table1 hc 
where 
    hc.Deleted = 0 
order by hc.NameLang1, VacancyCount desc 

để đặt hàng bằng cách sử dụng cột mới

select * from(
    select 
     *, 
     CONVERT(NVARCHAR(100), (select COUNT(*) from Table2 hv where hv.CompanyID=hc.CompanyID)) VacancyCount 
    from Table1 hc 
    where 
     hc.Deleted = 0 
)x 
Order by CASE WHEN @OrderByParam = 1 THEN NameLang1 ELSE VacancyCount END 

Cung cấp cột NameLang1VacancyCount có cùng kiểu dữ liệu.

+1

Chúng ta có thể đặt hàng bằng cách sử dụng kết quả đếm? – DotnetSparrow

+0

Yea ... chắc chắn ... U có thể thêm 'VacancyCount desc' hoặc' VacancyCount asc'. – TechDo

+0

techdo: Tôi đang thử Lệnh này theo số \t TRƯỜNG HỢP KHI @OrderByParam = 1 THEN NameLang1 ELSE VacancyCount END nhưng nó cho biết cột không hợp lệ VacancyCount – DotnetSparrow

2

Bạn sẽ phải liệt kê mọi cột trong mệnh đề GROUP BY
Các cột này là các cột trong bit SELECT *.

Tuy nhiên, điều này cũng đúng với ANSI SQL.

SELECT * chính nó là xấu anyway: nó luôn luôn tốt hơn để liệt kê một cách rõ ràng cột

2

Bạn đang nhóm sai. Bạn cần phải sử dụng tất cả các cột từ Bảng 1 trong SELECT thay vì '*' và trong mệnh đề GROUP BY.

Hoặc bạn có thể thử một cách tiếp cận khác nhau như thế này:

SELECT * 
FROM Table1 hc 
LEFT JOIN (SELECT CompanyID, COUNT(*) cnt FROM Table2 GROUP BY CompanyID) hv 
on hc.CompanyID = hv.CompanyID 
WHERE hc.Deleted = 0 
ORDER BY NameLang1 
+0

Chúng ta có thể sắp xếp theo kết quả bằng cnt không? – DotnetSparrow

+0

Tất nhiên, nó sẽ trở thành một cột bình thường khi được bao bọc dưới dạng truy vấn con và có thể được sử dụng trong bất kỳ mệnh đề nào (bao gồm thứ tự bằng). – ZZa

+0

Tôi đang sử dụng câu trả lời của techdo nhưng khi tôi sử dụng Đơn đặt hàng bởi \t TRƯỜNG HỢP KHI @OrderByParam = 1 THEN NameLang1 ELSE VacancyCount END nó cho biết cột không hợp lệ VacancyCount – DotnetSparrow

0

Hãy thử theo cách này bao gồm danh sách cột trong nhóm bởi

SELECT column1,column2,column3..,NameLang1,count(*) VacancyCount 
FROM Table1 hc 
LEFT JOIN Table2 hv 
on hc.CompanyID = hv.CompanyID 
WHERE hc.Deleted = 0 
group by column1,column2,column3 
ORDER BY NameLang1