2016-10-26 12 views
0

フィールドdate、value、および他のフィールドを持つall_dataという名前のテーブルがあります。複数の条件を使用したSELECTレコード

データベースから最後の7日、14日、および30日を選択する必要があります。ここで私は、同じクエリをしたい30日未満

$sql = "SELECT type_entry, COUNT(value) as val_count, FLOOR(SUM(value)) as sum_glu FROM all_data 
    WHERE DATEDIFF(NOW(), date) < 30 AND type_entry = 'Glucose' 
    ORDER BY date"; 

のために2回以上動作しますが、DATEDIFFを変え、私が持っているSELECTなステートメントがある

date  value 
10-25-16 30 
10-25-16 24 
10-26-16 42 

のように同じ日付で複数のエントリが存在することができ私はval_count1、val_count2、val_count3、sum_glu1、sum_glu2、sumglu3で終わるので、それぞれの平均を計算するために使用します。

私はそれを行う方法を理解するのに十分なSQLを知りません。ここで

は、私はその後、私は読書の週平均を行うことができ、7日間2016年10月19日からのレコード数を必要とする測定値

10/17/2016 116 
10/17/2016 277 
10/17/2016 145 
10/18/2016 150 
10/18/2016 125 
10/19/2016 200 

のサンプルです。

enter image description here

+0

「10/19/2016」の後に7日間表示されたレコードの数はどれだけですか? –

+0

はい、最後のレコードの前とそれを含むでしょう。 例 - 10/20/2016と10/27/2016の18個のレコードがあり、それらのレコードのすべての値を合計し、次にレコードの数で除算して平均値を求めたいとします。 – gary1946

+0

? 7日か最後のレコードまでしたいですか? –

答えて

1

あなたはここで、条件付き集約を使用することができます。

SELECT type_entry, 
     SUM(CASE WHEN DATEDIFF(NOW(), date) < 30 THEN 1 ELSE 0 END) AS val_count_30, 
     FLOOR(SUM(CASE WHEN DATEDIFF(NOW(), date) < 30 THEN value ELSE 0 END)) AS sum_glu_30, 
     SUM(CASE WHEN DATEDIFF(NOW(), date) < 14 THEN 1 ELSE 0 END) AS val_count_14, 
     FLOOR(SUM(CASE WHEN DATEDIFF(NOW(), date) < 14 THEN value ELSE 0 END)) AS sum_glu_14, 
     SUM(CASE WHEN DATEDIFF(NOW(), date) < 7 THEN 1 ELSE 0 END) AS val_count_7, 
     FLOOR(SUM(CASE WHEN DATEDIFF(NOW(), date) < 7 THEN value ELSE 0 END)) AS sum_glu_7 
FROM all_data 
WHERE type_entry = 'Glucose' 
ORDER BY date 

を使用すると、わずか7日間のvalueの平均は7日間10/19/2016に開始したい場合は、あなただけのWHERE句を使用することができます:

SELECT type_entry, 
     AVG(value) AS avgValue 
FROM all_data 
WHERE date BETWEEN '2016-10-19' AND DATE_ADD('2016-10-19', INTERVAL 7 DAY) AND 
     type_entry = 'Glucose' 
GROUP BY type_entry 
+0

それに応じてあなたの質問を更新し、最後の日の意味を説明してください。 –

+0

ここに投稿はありません。 –

+0

申し訳ありません。私に知らせてくれてありがとう – gary1946

0

基本的にすべての行を条件で取得できます0になり、次のすべての条件にこの基準が含まれます。集計関数内にCASE式を追加して、条件に一致する行内でのみ集計を実行できます。私がしたすべては、列のすべてのペアのための< Xを変更しました:

SELECT 
    type_entry, 
    COUNT(CASE WHEN DATEDIFF(NOW(), date) < 30 THEN value END) as val_count1, 
    FLOOR(SUM(CASE WHEN DATEDIFF(NOW(), date) < 30 THEN value END)) as sum_glu1, 
    COUNT(CASE WHEN DATEDIFF(NOW(), date) < 14 THEN value END) as val_count2, 
    FLOOR(SUM(CASE WHEN DATEDIFF(NOW(), date) < 14 THEN value END)) as sum_glu2, 
    COUNT(CASE WHEN DATEDIFF(NOW(), date) < 7 THEN value END) as val_count3, 
    FLOOR(SUM(CASE WHEN DATEDIFF(NOW(), date) < 7 THEN value END)) as sum_glu3 
FROM all_data 
WHERE DATEDIFF(NOW(), date) < 30 AND type_entry = 'Glucose' 
GROUP BY type_entry 
ORDER BY date 

また、私が行方不明GROUP BY句を追加したことに注意してください。 MySQLはそれを許していますが、多くの異なるデータベースがエラーになります。推奨される方法は、この点でMySQLのメカニズムに頼ることではありません。

関連する問題