2016-03-31 27 views
0

我有一個SQL查詢,用於顯示在指定日期範圍內按天創建的工單的數量。當我查詢單個日期範圍時(例如2016年3月1日至2016年3月31日),它運行良好。SQL Query根據同一視圖中的不同日期顯示相同的數據

SELECT DATEADD(dd, DATEDIFF(dd, 0, dateCreated), 0) the_date, 
COUNT(*) work_order_count 
FROM WorkOrder 
where active = 1 and 
dateCreated >= '3/1/2016' and 
dateCreated <= '3/31/2016 23:59:59' 
GROUP BY DATEADD(dd, DATEDIFF(dd, 0, dateCreated), 0) 
order by 1; 

我想利用這個相同的查詢更進了一步,這樣我可以查詢相同的數據,但顯示結果爲多個日期範圍。我的具體目的是並排顯示前一年比較的數據。理想情況下,我想展示2014年,2015年和2016年爲3/1-3/31創建的工作訂單數量,但都在同一視圖/結果中。

這可能嗎?我研究過連接,但它們似乎是當你使用不同的表格,而不是同一個表格。

+0

創建一個存儲過程接受你的開始/結束日期作爲參數。根據你想用程序獲得的創造性,你應該很容易地通過使用sql的'dateadd()'函數做一些簡單的日期數學來返回3個數據集。 – fnostro

+0

可以在同一個表上使用子查詢完成自連接,例如:WorkOrderAlias1.somejoinfield = WorkOrder.somejoinfield'上的INNER JOIN(從WorkOrder中選擇<您的字段列表>)WorkOrderAlias1作爲WorkOrderAlias1。 – fnostro

回答

1

只需使用條件聚合(或樞軸):

SELECT CAST(dateCreated as DATE) as the_date, 
     SUM(CASE WHEN YEAR(dateCreated) = 2014 THEN 1 ELSE 0 END) as cnt_2014, 
     SUM(CASE WHEN YEAR(dateCreated) = 2015 THEN 1 ELSE 0 END) as cnt_2015, 
     SUM(CASE WHEN YEAR(dateCreated) = 2016 THEN 1 ELSE 0 END) as cnt_2016 
FROM WorkOrder 
WHERE active = 1 and 
     MONTH(dateCreated) = 3 and 
     YEAR(dateCreated) in (2014, 2015, 2016) 
GROUP BY CAST(dateCreated as DATE) 
ORDER BY the_date; 
0

使用數據透視表:

;with cte1 as (
    select dateCreated, datepart(year, dateCreated) as Y 
    from WorkOrder 
    where datepart(month, dateCreated) = 3 and datepart(day, dateCreated) between 5 and 25 
) 
SELECT * 
FROM cte1 
    PIVOT 
    (
    count(dateCreated) 
    FOR Y in ([2014], [2015], [2016]) 
) as pv 
0

如何像:

SELECT 
    SUM(
     CASE 
      WHEN dateCreated BETWEEN '3/1/2014' AND '3/31/2014 23:59:59' 
      THEN 1 
      ELSE 0 
     END) AS March2014, 
    SUM(
     CASE 
      WHEN dateCreated BETWEEN '3/1/2015' AND '3/31/2015 23:59:59' 
      THEN 1 
      ELSE 0 
     END) AS March2015, 
    SUM(
     CASE 
      WHEN dateCreated BETWEEN '3/1/2016' AND '3/31/2016 23:59:59' 
      THEN 1 
      ELSE 0 
     END) AS March2016 
FROM WorkOrder 
WHERE active = 1; 
0
SELECT datepart(dd, 'yyyy'), datepart(dd, 'MM'), datepart(dd, 'dd'), 
     COUNT(*) work_order_count 
FROM WorkOrder 
where active = 1 
    and dateCreated >= '3/1/2016' 
    and dateCreated < '4/1/2020' 
GROUP BY datepart(dd, 'yyyy'), datepart(dd, 'MM'), datepart(dd, 'dd')  
order by datepart(dd, 'yyyy'), datepart(dd, 'MM'), datepart(dd, 'dd'); 
相關問題