2012-01-06 42 views
5

SQL 2005, Tôi có một bảng có cột 'ages_c', tôi cần nhóm các bản ghi theo độ tuổi. Đây là câu hỏi mà tôi tìm thấy trên trang web này và nó nhận được tôi 90% có nhưng 'nhóm bằng' được erroring, * Tên cột không hợp lệ 'AGE_RANGE' *Nhóm SQL theo độ tuổi

select 
    case 
    when age_c <18 then 'Under 18' 
    when age_c between 18 and 24 then '18-24' 
    when age_c between 25 and 34then '25-34' 
END as age_range, 
Count(*) as count 
from contacts 
group by age_range 
order by age_range 

Khi tôi nhóm và trật tự do 'age_c 'kết quả của tôi là:

Under 18 1 
    18-24 1 
    18-24 1 
    25-34 1 

Những gì tôi muốn là:

Under 18 1 
    18-24 2  
    25-34 1 

Cảm ơn.

Trả lời

9

Hãy thử nó theo cách này thay vì:

SELECT SUM(CASE WHEN age_c < 18 THEN 1 ELSE 0 END) AS [Under 18], 
     SUM(CASE WHEN age_c BETWEEN 18 AND 24 THEN 1 ELSE 0 END) AS [18-24], 
     SUM(CASE WHEN age_c BETWEEN 25 AND 34 THEN 1 ELSE 0 END) AS [25-34] 
FROM contacts 
+1

Cảm ơn Joe ... Tôi đánh giá cao sự đơn giản. – Stan

7

Nhóm theo số age_c - age_range không phải là cột thực. Cụ thể hơn, làm được điều này:

group by case 
    when age_c <18 then 'Under 18' 
    when age_c between 18 and 24 then '18-24' 
    when age_c between 25 and 34then '25-34' 
END 

Kể từ age_range là một cột aliased, các group by là không nhận thức được điều đó chút nào. Việc nhóm diễn ra trước khi tập hợp cột được tính toán. Mệnh đề duy nhất mà bạn có thể sử dụng bí danh của mình là order by, vì đó là mệnh đề duy nhất được thực thi sau tập hợp cột được tính toán.

+0

Điều đó không làm việc cho anh ta, anh ta muốn dãy . –

+0

@Sheridanbulger đây chính xác là những gì được yêu cầu và hoạt động tốt. Xem ví dụ làm việc tại [Ví dụ về nhóm theo trường hợp] (http://data.stackexchange.com/stackoverflow/s/2346/grouping-by-case-example) –

+0

Oh Tôi xin lỗi. Thoạt nhìn tôi thấy nhóm chỉ bằng age_c. Bạn đã chỉnh sửa nó chưa? Trong cả hai trường hợp, có mã đó (hoặc bất kỳ câu trả lời nào khác) sẽ hoạt động tốt. –

0

Đó có phải là mã thực sự bạn đang sử dụng không? Nó không giống như nó bởi vì bạn đang thiếu một không gian giữa 34 và sau đó. Mã đó sẽ lỗi trong SQL. Tâm trí chia sẻ truy vấn chưa sửa đổi thực tế?

Dù sao, bạn có thể sử dụng bảng tạm thời hoặc truy vấn lồng nhau.

SELECT 
CASE 
    WHEN age_c <18 THEN 'Under 18' 
    WHEN age_c BETWEEN 18 AND 24 THEN '18-24' 
    WHEN age_c BETWEEN 25 AND 34 THEN '25-34' 
END AS age_range, 
INTO #TempAges 
FROM contacts 
ORDER BY age_c 

SELECT COUNT(*) FROM #TempAges GROUP BY age_range 

Đừng quên để thả các bảng tạm thời khi bạn đang thực hiện với nó

0

Bạn không thể nhóm bởi một cột bạn tạo trong truy vấn. Bạn sẽ phải làm điều đó như thế này:

SELECT count(*), * FROM 
(
select 
    case 
    when age_c <18 then 'Under 18' 
    when age_c between 18 and 24 then '18-24' 
    when age_c between 25 and 34then '25-34' 
END as age_range 
from contacts 
) t 
group by age_range 
order by age_range 

hay GROUP BY

case 
     when age_c <18 then 'Under 18' 
     when age_c between 18 and 24 then '18-24' 
     when age_c between 25 and 34then '25-34' 
END 
+0

Tôi muốn một bảng tạm thời đến một lồng nhau truy vấn chỉ vì nó làm cho một truy vấn tìm kiếm rõ ràng hơn, nhưng nó thực sự là hai mặt của cùng một đồng tiền. –

+0

Cảm ơn Mithrandir. Điều này là rất gần, tôi đã phải sắp xếp lại nó một chút để có được nó để làm việc ... nhưng làm việc nó. – Stan

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