2010-07-13 14 views
5

Tôi muốn nhóm và đếm số lượng các mục trong một bảng đáp ứng tiêu chí colA <= x < colBLàm cách nào để sử dụng SQL để nhóm và đếm số hàng có giá trị cho một cột là <= x và giá trị cho cột khác> x?

Giả sử tôi có bảng sau:

 
index Game   MinAgeInclusive MaxAgeExclusive 
-------------------------------------------------------- 
1  Candy Land  3     8 
2  Checkers  5     255 
3  Chess   12    255 
4  Sorry!   6     12 
5  Monopoly  10    30 

(đây không phải là những gì tôi đang làm, nhưng nó tóm tắt đi rất nhiều những biến chứng khác với thiết lập của tôi)

Giả sử tôi muốn để có được một bảng mà nói với tôi bao nhiêu trò chơi là thích hợp cho các lứa tuổi khác nhau:

 
Age NumberOfAgeAppropriateGames 
---------------------------------- 
0  0 
... 
3  1 
4  1 
5  2 
6  3 
7  3 
8  2 
9  2 
10  3 
... 
40  2 

tôi chắc chắn có thể nhận được giá trị cho một tuổi duy nhất:

SELECT 
COUNT(*) 
FROM GameTable 
WHERE MinAgeInclusive <= age AND age < MaxAgeExclusive 

Và tôi biết làm thế nào để có được số lượng các mục mà có một trao MaxAgeExclusive

SELECT 
MaxAgeExclusive, COUNT(*) AS GameCount 
FROM GameTable 
GROUP BY MaxAgeExclusive 

nhưng tôi không thể khá hình làm thế nào để làm cả hai.

Vì ứng dụng thực tế của tôi đang thực hiện việc này trên một bảng với hàng triệu mục nhập và có thể phải xác định số lượng hàng nghìn giá trị x, tôi hy vọng tôi có thể tối đa hóa hiệu suất bằng cách thực hiện toàn bộ điều đó trong một truy vấn .

+1

Tôi biết rằng với ví dụ tôi đã đưa ra, điều này nghe có vẻ mơ hồ như một câu hỏi về bài tập về nhà; điều này có lẽ là vì tôi đã cố gắng tóm tắt tất cả các chi tiết của vấn đề thực tế của mình và tạo ra một vấn đề mới vẫn có một số ngữ cảnh/ý nghĩa ... –

+0

Bạn đang sử dụng cơ sở dữ liệu nào? Và phiên bản nào? –

+0

Vâng, khuôn khổ mà tôi đang xây dựng yêu cầu rằng nó có phần chung chung; Tôi tin rằng nó nhắm mục tiêu Microsoft SQL, MySQL và Access (!) –

Trả lời

6

Để thực hiện điều này theo cách hợp lý, bạn có thể nên tạo một bảng số Auxilliary cho chuỗi này với một dãy số từ 0 đến giá trị lớn nhất của bạn và sau đó sử dụng một số thứ như sau.

SELECT 
COUNT(*) AS GameCount, N.Number 
FROM Numbers N 
     LEFT OUTER JOIN GameTable ON 
      MinAgeInclusive <= N.Number AND N.Number < MaxAgeExclusive 
WHERE N.Number < 100 
GROUP BY N.Number 
+0

+1, bạn cần [tạo một bảng số] (http://stackoverflow.com/questions/1393951/what-is-the-best-way-to -create-and-populate-a-number-table) và sau đó tham gia vào đó –

+1

Vâng, tôi đoán tôi đã đi đúng hướng: http://stackoverflow.com/questions/3236452 –

+0

Cảm ơn Martin, điều này dường như làm việc đẹp –

1

Phạm vi tuổi được kiểm tra sẽ là từ 10 đến 50.

WITH Age_Tbl 
    AS 
    (
     SELECT 10 AS Age 
     UNION ALL 
     SELECT Age+1 
     FROM Age_Tbl 
     WHERE Age+1 <= 50 
    ) 
    SELECT Age, 
    (select COUNT(*) 
    FROM GameTable G 
    WHERE A.Age between G.Min and G.Max) NumberOfAgeAppropriateGames 
from Age_Tbl A 

Edit: Theo Martin Smith nhận xét: Nó sẽ chỉ làm việc trong MS SQL Server.

+1

Điều này sẽ không hoạt động trong MySQL và Access. –

+0

không nên là 'SELECT 0 AS Age' ... trong kết quả mẫu của câu hỏi, Độ tuổi bắt đầu bằng 0 và không phải là mười. –

Các vấn đề liên quan