2016-03-31 17 views
0

私は、指定した日付範囲内で1日に作成された作業オーダーの数を表示するために使用するSQLクエリを使用しています。これは、3/1/2016から3/31/2016など、1つの日付範囲をクエリするとうまくいきます。SQL同じデータを表示するが、同じビュー内の異なる日付に基づくクエリ

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

セルフ・ジョインは、同じ表のサブクエリを使用して行うことができます。例: 'INNER JOIN(<あなたの日付基準>をWorkOrderの<フィールド・リストを選択>)をWorkOrderAlias1.somejoinfield = WorkOrder.somejoinfield'の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'); 
関連する問題