2012-06-24 29 views
6

i có truy vấn này rất đơn giản:Nhóm điều kiện theo máy chủ sql?

SELECT YEAR(P.DateCreated) 
     ,MONTH(P.DateCreated) 
     ,COUNT(*) AS cnt 
FROM tbl1, 
     tbl2.... 
GROUP BY 
     MONTH(P.DateCreated) 
     ,YEAR(P.DateCreated) 

này sẽ phát ra:

enter image description here

bây giờ tôi cần phải truy vấn tương tự nhưng với groupby chỉ mỗi năm:

vậy:

SELECT YEAR(P.DateCreated) 

     ,COUNT(*) AS cnt 
FROM tbl1, 
     tbl2.... 
GROUP BY 
     YEAR(P.DateCreated) 

i không muốn thực hiện 2 truy vấn.

có cách nào để tôi có thể thực hiện điều kiện group by tại đây không?

tôi có thể làm gì với một được thay thế bằng khác, nhưng tôi không thể làm một được thay thế bằng hai ...

GROUP BY 
    CASE WHEN @timeMode='y' THEN YEAR(P.DateCreated) 
      WHEN @timeMode='m' THEN MONTH(P.DateCreated), YEAR(P.DateCreated) end 

enter image description here

bất kỳ sự giúp đỡ?

Trả lời

14

Bạn sẽ được tốt hơn off với hai truy vấn riêng biệt nhưng có thể làm điều đó như

GROUP BY YEAR(P.DateCreated), 
     CASE 
      WHEN @timeMode='m' THEN MONTH(P.DateCreated) end 

như WHEN @timeMode <> 'm' các GROUP BY biểu thức thứ hai sẽ NULL cho tất cả các hàng và không ảnh hưởng đến kết quả.

+0

nếu tôi cung cấp @ timeMode = 'y' để truy vấn sẽ có ',' ở cuối .... lỗi? –

+1

vì vậy tôi phải bắt đầu từ nhóm _smallest_ theo đơn vị và mở rộng theo trường hợp .... riught? –

+0

Không chắc chắn những gì bạn đang yêu cầu. 'CASE' chỉ có thể trả về một biểu thức duy nhất. Điều này trả lời câu hỏi bạn thực sự hỏi. –

5

Bạn có thể sử dụng một khoản over trở lại cả mỗi năm một lần và số lượng mỗi tháng trong một truy vấn:

SELECT distinct YEAR(P.DateCreated) as Year 
,  MONTH(P.DateCreated) as Month 
,  COUNT(*) over (partition by YEAR(P.DateCreated), MONTH(P.DateCreated)) 
      as MonthCount 
,  COUNT(*) over (partition by YEAR(P.DateCreated)) as YearCount 
FROM YourTable P 

Live example at SQL Fiddle.

+0

tôi không thấy nó giúp như thế nào ... :) bạn có thể xây dựng được không? –

+0

Nó sẽ trả về cả hai kết quả. Nếu bạn muốn chuyển đổi truy vấn giữa hai chế độ, hãy xem câu trả lời của @ MartinSmith! – Andomar

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