使用多个critira选择记录

时间:2016-10-26 23:49:06

标签: mysql select

我有一个名为all_data的表,其中包含字段日期,值和其他字段。

我需要从数据库中选择最后7天,14天和30天。可以有几个条目具有相同的日期,如

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

以下是我所拥有的SELECT Statment,工作时间不到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次,但是用&lt; 14和&lt; 7更改DATEDIFF语句所以我最终得到了val_count1,val_count2,val_count3,sum_glu1,sum_glu2,sumglu3我会用它来计算每个的平均值

我不太了解SQL如何去做。

以下是读数示例

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

我需要从2016年10月19日开始的7天的记录数量,然后我可以每周平均读数。

enter image description here

2 个答案:

答案 0 :(得分: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

如果您只想在value开始的7天内10/19/2016的平均时间为7天,那么您可以使用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

答案 1 :(得分:0)

基本上,您可以检索标准为< 30的所有行,并且所有以下标准都包含在此标准中。您可以在聚合函数中添加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机制。