我有一个非常简单的表格:
mysql> desc stats;
+-------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+----------------+
| entry_id | int(11) | NO | PRI | NULL | auto_increment |
| entry_date | date | NO | | NULL | |
| show_name | varchar(40) | NO | | NULL | |
| month_total | int(11) | NO | | NULL | |
+-------------+-------------+------+-----+---------+----------------+
我想要一个select语句,它会在一个语句中提供当前日期和前一天数据的结果,例如,结果将类似于
show_name month_total(Current day) monthly_total(Previous Day)
在单个sql语句中有一种简单的方法吗?
答案 0 :(得分:0)
更新:将entry_date添加到输出
是有意义的SELECT c.show_name,
c.month_total current_month_total,
p.month_total prev_month_total
FROM stats c INNER JOIN
stats p ON p.entry_date = c.entry_date - INTERVAL 1 DAY
假设您有样本数据,如
+----------+------------+-----------+-------------+
| entry_id | entry_date | show_name | month_total |
+----------+------------+-----------+-------------+
| 1 | 2013-03-07 | Name1 | 10 |
| 2 | 2013-03-08 | Name2 | 20 |
| 3 | 2013-03-09 | Name3 | 30 |
| 4 | 2013-03-10 | Name4 | 40 |
+----------+------------+-----------+-------------+
查询的输出是
+-----------+------------+---------------------+------------------+
| show_name | entry_date | current_month_total | prev_month_total |
+-----------+------------+---------------------+------------------+
| Name2 | 2013-03-08 | 20 | 10 |
| Name3 | 2013-03-09 | 30 | 20 |
| Name4 | 2013-03-10 | 40 | 30 |
+-----------+------------+---------------------+------------------+
如果您需要特定日期或日期间隔的输出,只需添加WHERE
条款
今天
...
WHERE c.entry_date = CURDATE();
03/09至03/10
...
WHERE c.entry_date BETWEEN '2013-03-09' AND '2013-03-10'
答案 1 :(得分:0)
如果今天是指今天,请在select语句中使用SUBDATE和CURDATE函数以及子查询:
SELECT
show_name,
month_total AS current_day_total,
(SELECT month_total FROM stats WHERE entry_date = SUBDATE(CURDATE(), 1) LIMIT 1) AS previous_day_total
FROM stats
WHERE entry_date = CURDATE();
请参阅fiddle。
如果您希望每天都这样,而不仅仅是当天,请加入。
答案 2 :(得分:0)
假设这个测试数据:
+----------+------------+-----------+-------------+
| entry_id | entry_date | show_name | month_total |
| 1 | 2013-03-07 | test1 | 1 |
| 2 | 2013-03-07 | test2 | 11 |
| 3 | 2013-03-08 | test1 | 2 |
| 4 | 2013-03-08 | test2 | 22 |
| 5 | 2013-03-08 | test3 | 222 |
| 6 | 2013-03-09 | test1 | 3 |
| 7 | 2013-03-09 | test2 | 33 |
| 8 | 2013-03-07 | test1 | 5 |
+----------+------------+-----------+-------------+
如果每天有多个不同名称的条目,那么这应该效果很好:
SELECT c.show_name, c.entry_date,
c.month_total current_day_month_total,
IFNULL(p.month_total,0) previous_day_month_total
FROM test.stats c LEFT JOIN test.stats p
ON p.entry_date = c.entry_date - INTERVAL 1 DAY
AND c.show_name = p.show_name
GROUP BY c.entry_date, c.show_name;
+-----------+------------+-------------------------+--------------------------+
| show_name | entry_date | current_day_month_total | previous_day_month_total |
| test1 | 2013-03-07 | 1 | 0 |
| test2 | 2013-03-07 | 11 | 0 |
| test1 | 2013-03-08 | 2 | 1 |
| test2 | 2013-03-08 | 22 | 11 |
| test3 | 2013-03-08 | 222 | 0 |
| test1 | 2013-03-09 | 3 | 2 |
| test2 | 2013-03-09 | 33 | 22 |
+-----------+------------+-------------------------+--------------------------+
如果每天甚至有多个条目和名称,那么它们将组合它们的值: (参见test1的结果表第一行 - id1:1 + id8:5 = 6)
SELECT c.show_name, c.entry_date,
c.month_total current_day_month_total,
IFNULL(p.month_total,0) previous_day_month_total
FROM (SELECT show_name, entry_date, SUM(month_total) month_total
FROM test.stats
GROUP BY entry_date, show_name) c
LEFT JOIN
(SELECT show_name, entry_date, SUM(month_total) month_total
FROM test.stats
GROUP BY entry_date, show_name) p
ON p.entry_date = c.entry_date - INTERVAL 1 DAY
AND c.show_name = p.show_name;
+-----------+------------+-------------------------+--------------------------+
| show_name | entry_date | current_day_month_total | previous_day_month_total |
| test1 | 2013-03-07 | 6 | 0 |
| test2 | 2013-03-07 | 11 | 0 |
| test1 | 2013-03-08 | 2 | 6 |
| test2 | 2013-03-08 | 22 | 11 |
| test3 | 2013-03-08 | 222 | 0 |
| test1 | 2013-03-09 | 3 | 2 |
| test2 | 2013-03-09 | 33 | 22 |
+-----------+------------+-------------------------+--------------------------+