2012-11-05 40 views
26

Về cơ bản tôi có một bảng tương tự như sau:số Tính của lần xuất hiện cho mỗi giá trị duy nhất

time.....activities.....length 
13:00........3.............1 
13:15........2.............2 
13:00........3.............2 
13:30........1.............1 
13:45........2.............3 
13:15........5.............1 
13:45........1.............3 
13:15........3.............1 
13:45........3.............2 
13:45........1.............1 
13:15........3.............3 

Một vài lưu ý:

  • Các hoạt động có thể từ 1 đến 5
  • Chiều dài có thể nằm trong khoảng từ 1 đến 3

Truy vấn sẽ trả về:

time........count 
13:00.........2 
13:15.........2 
13:30.........0 
13:45.........1 

Về cơ bản cho mỗi lần duy nhất tôi muốn có một đếm số hàng trong đó giá trị hoạt động là 3.

Vì vậy, sau đó tôi có thể nói:

At 13:00 there were X amount of activity 3s. 
At 13:45 there were Y amount of activity 3s. 

Sau đó, tôi muốn có một số cho hoạt động 1s, 2s, 4s và 5s. vì vậy tôi có thể vẽ phân phối cho từng thời điểm duy nhất.

Trả lời

47

Có, bạn có thể sử dụng group by:

select time, activities, count(*) from table group by time, activities; 
+0

Cảm ơn! Điều này có vẻ là giải pháp đơn giản và chức năng nhất :) –

+0

@JamesElder, vui lòng trợ giúp! Bạn có xem xét đánh dấu câu trả lời là "được chấp nhận" không? :-) –

3

Nếu tôi hiểu câu hỏi của bạn, điều này có hiệu quả không? (Bạn sẽ phải thay thế với tên cột và bảng thực tế của bạn)

SELECT time_col, COUNT(time_col) As Count 
FROM time_table 
GROUP BY time_col 
WHERE activity_col = 3 
+0

cảm ơn sự giúp đỡ của bạn! –

8
select time, coalesce(count(case when activities = 3 then 1 end), 0) as count 
from MyTable 
group by time 

SQL Fiddle Example

Output:

| TIME | COUNT | 
----------------- 
| 13:00 |  2 | 
| 13:15 |  2 | 
| 13:30 |  0 | 
| 13:45 |  1 | 

Nếu bạn muốn đếm tất cả các hoạt động trong một truy vấn, bạn có thể làm:

select time, 
    coalesce(count(case when activities = 1 then 1 end), 0) as count1, 
    coalesce(count(case when activities = 2 then 1 end), 0) as count2, 
    coalesce(count(case when activities = 3 then 1 end), 0) as count3, 
    coalesce(count(case when activities = 4 then 1 end), 0) as count4, 
    coalesce(count(case when activities = 5 then 1 end), 0) as count5 
from MyTable 
group by time 

Lợi thế của việc phân nhóm này theo các hoạt động, là nó sẽ trả về số 0 ngay cả khi không có hoạt động của loại đó cho phân đoạn thời gian đó.

Tất nhiên, điều này sẽ không trả về các hàng cho phân đoạn thời gian mà không có hoạt động thuộc bất kỳ loại nào. Nếu bạn cần điều đó, bạn sẽ cần sử dụng một phép nối trái với bảng liệt kê tất cả các phân đoạn thời gian có thể.

+0

cảm ơn sự giúp đỡ của bạn! –

+0

Điều này rất hữu ích, vì tôi muốn có kết quả đếm các giá trị khác nhau trên mỗi kết quả. Cảm ơn! –

+0

đếm với trường hợp là một giải pháp hoàn hảo – dynamic

0

Bạn nên thay đổi các truy vấn như:

CHỌN time_col, COUNT (time_col) Như Đếm TỪ time_table ĐÂU activity_col = 3 GROUP BY time_col

Công cụ vl này hoạt động chính xác ...

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