2016-05-17 12 views
0

この質問のフレーズにはどのような正しい方法があるのか​​よくわかりませんが、これは意味があると思います。日付範囲内で四半期ごとにレコード数をカウントする

SELECT 
    c.ID, 
    c.Name, 
    c.DateAdded, 
    c.LastContact 
FROM 
    computers AS c 
WHERE 
    LENGTH(DateAdded) > 1 
ORDER BY 
    DateAdded ASC; 

返します:

ID Name DateAdded   LastContact 
1 MUTHER 9/2/2012 1:23  5/17/2016 13:57 
5 VGER 12/19/2012 10:44 5/17/2016 13:56 
7 HELPER 1/13/2013 18:09  5/17/2016 13:57 
9 JARVIS 1/15/2013 0:28  7/31/2015 0:20 
12 PHLFS1 1/17/2013 18:41  2/17/2013 13:37 

を私はコンピュータがこのクエリを四半期で追加された日付をカウントすることができる午前:

SELECT 
    YEAR(DateAdded) AS YEAR, 
    QUARTER(DateAdded) AS QUARTER, 
    COUNT(ComputerID) AS 'added-during-qtr' 
FROM 
    computers 
WHERE 
    LENGTH(DateAdded) > 1 
GROUP BY 
    YEAR(DateAdded), 
    QUARTER(DateAdded) 
ORDER BY 
    YEAR(DateAdded), 
    QUARTER(DateAdded) 

私に与え、私は、クエリを持っていますいつ活性化されたかのカウント:

year quarter added-during-qtr 
2012 3  1 
2012 4  1 
2013 1  3 

しかしませ彼らは私が本当に探しているものです四半期かに関係なく、中にアクティブであった場合:

year quarter active-during-qtr 
2012 3  1 
2012 4  2 
2013 1  5 
2013 2  4 

私は疑問に正しい道を尋ねたりないけどよかどうかわからないんだけど日の終わりに、DateAddedとLastContactの間で「アクティブ」だったコンピュータの数を年と四半期でソートしたいと考えています。理想的には、caseステートメントに範囲を手動で追加する必要はありません。前もって感謝します。

+1

コンピュータはその後、「アクティブ」だった場合どのようにあなたが知っていますか?あなたの投稿に現在表示されていないか、別の方法で定義されている別の列がありますか?あなたの質問を手伝うためには、この情報を知る必要があります。 – Fuzzzzel

+0

@Fuzzzzelと同じだと思います。 'Deactivate'カラムでなければなりませんが、他の賢明な方法では、5台のコンピュータが2013年の第1四半期から次の四半期までに有効になった後に、どのように4 –

+1

を探していますか?** 2013 2 4 **しかし、2013年のデータはありませんあなたのテーブルのQ2 – Alex

答えて

0

それでもあなたは、2013年

の第2四半期のために何かを期待しかし、ここで私の試みである理由を、あなたのロジックを取得することはできません:あなたの最後によると

http://sqlfiddle.com/#!9/ce133d/7

SELECT 
    p.year, 
    p.quarter, 
    COUNT(DISTINCT c.id) 
FROM (
    SELECT 
    YEAR(DateAdded) AS YEAR, 
    QUARTER(DateAdded) AS QUARTER, 
    CONCAT(YEAR(DateAdded),QUARTER(DateAdded)) period 
    FROM computers 
    WHERE LENGTH(DateAdded) > 1 
    GROUP BY YEAR(DateAdded), QUARTER(DateAdded) 
    ORDER BY YEAR(DateAdded), QUARTER(DateAdded) 
) p #periods 
LEFT JOIN computers c 
ON p.period>=CONCAT(YEAR(c.DateAdded),QUARTER(c.DateAdded)) 
GROUP BY p.period 

更新この変更を行うことができたコメント:

http://sqlfiddle.com/#!9/0c323e/5

SELECT 
    p.year, 
    p.quarter, 
    COUNT(DISTINCT c.id) 
FROM (
    SELECT 
    y.year, 
    q.quarter, 
    CONCAT(y.year,q.quarter) period 
    FROM (SELECT 2012 AS year UNION SELECT 2013) y 
    LEFT JOIN (SELECT 1 AS quarter UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) q 
    ON 1 
) p #periods 
LEFT JOIN computers c 
ON p.period>=CONCAT(YEAR(c.DateAdded),QUARTER(c.DateAdded)) 
    AND p.period<=CONCAT(YEAR(c.LastContact),QUARTER(c.LastContact)) 
GROUP BY p.period 

と、あなたがこのようGROUP BY p.periodWHERE句を追加することができます期間を制限する必要がある場合:

WHERE p.period<='20132' 

http://sqlfiddle.com/#!9/0c323e/7

+0

基本的には、指定された範囲内でコンピュータがサーバーにチェックインしたかどうかを追跡します。 2015年1月1日にそれらを追加し、2015年4月15日にコンピュータのチェックを停止した場合、Q1とQ2でカウントされますが、Q3のカウントが減少します。 –

+0

私が尋ねたことを読んだことはありますか? * 1/1/2015 *に追加した場合、この部分は非常に明確です。あなたのサンプルにはそのようなデータはありません。唯一の期間は 'Q3-2012、Q4-2012、Q1-2013'です。あなたの投稿をチェックしてください。 – Alex

+0

Alexに感謝します。私はあなたが尋ねたことを読んだので、私の質問は少し不明だと思う。クエリでは、四半期中に「チェックインした」コンピュータの数をカウントする必要があります。私は彼らがチェックインを開始した日付、チェックインを止めた日付、テストしたい四半期を持っています。 2013年の第2四半期の結果です2013年4月1日から2013年6月30日までの間にチェックインしたコンピュータは4台のみです。 –

関連する問題