1

私は非常に単純なテーブルを持っています:

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 ステートメント内でこれを行う簡単な方法はありますか?

4

3 に答える 3

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();

フィドルを参照してください。

今日だけでなく、毎日これが必要な場合は、参加してください。

于 2013-03-08T21:28:20.707 に答える
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 |
+-----------+------------+---------------------+------------------+

これがsqlfiddleの例です

特定の日付または日付の間隔の出力が必要な場合は、WHERE句を追加するだけです。
今日のために

...
WHERE c.entry_date = CURDATE();

03/09から03/10まで

...
WHERE c.entry_date BETWEEN '2013-03-09' AND '2013-03-10'
于 2013-03-08T21:13:48.660 に答える
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 |
+----------+------------+-----------+-------------+

異なる名前で 1 日に複数のエントリがある場合、これはうまく機能するはずです。

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 |
+-----------+------------+-------------------------+--------------------------+

1 日と名前ごとに複数のエントリがある場合は、それらの値を結合します: (test1 の結果テーブルの 1 行目を参照 - 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 |
+-----------+------------+-------------------------+--------------------------+
于 2013-03-08T22:40:24.150 に答える