各行に日付と任意の数値が含まれるテーブルがあります。特定の動的な日付間隔について、この値を合計する必要があります。
SELECT VERSION();
5.0.51a-24+lenny5
CREATE TABLE IF NOT EXISTS `work_entries` (
`entry_id` int(10) unsigned NOT NULL auto_increment,
`employee_id` tinyint(3) unsigned NOT NULL,
`work_date` date NOT NULL,
`hour_count` tinyint(3) unsigned NOT NULL,
PRIMARY KEY (`entry_id`)
);
INSERT INTO `work_entries` (`entry_id`, `employee_id`, `work_date`, `hour_count`) VALUES
(1, 1, '2011-04-25', 2),
(2, 1, '2011-04-26', 3),
(3, 1, '2011-04-27', 1),
(4, 2, '2011-04-25', 2),
(5, 2, '2011-04-27', 4),
(6, 1, '2011-05-08', 2),
(7, 2, '2011-05-06', 8),
(8, 2, '2011-05-08', 9),
(9, 2, '2011-05-09', 1),
(10, 1, '2011-05-29', 3),
(11, 1, '2011-05-30', 1),
(12, 2, '2011-05-30', 2),
(13, 1, '2011-06-02', 2),
(14, 1, '2011-06-04', 3),
(15, 1, '2011-06-14', 1),
(16, 2, '2011-06-14', 2),
(17, 2, '2011-06-17', 4),
(18, 1, '2011-06-18', 2),
(19, 2, '2011-06-19', 8),
(20, 2, '2011-06-26', 9),
(21, 2, '2011-07-01', 1),
(22, 1, '2011-07-03', 3),
(23, 1, '2011-07-03', 1),
(24, 2, '2011-07-16', 2);
次のクエリは、上記のデータ セットの正しい出力を返し、何をしようとしているのかを示しているはずですが、に基づいて年と月の値を生成する必要がありますwork_date
。日 (16、15) は決して変わりません。具体的には、このクエリは 2 つの行を生成します。1 つは指定された期間用で、もう 1 つはその他の期間用です。各期間 (N 月の 16 日から N+1 月の 15 日まで、値を持つすべての月) ごとに 1 行が必要です。
SELECT
SUM(hour_count) AS res
FROM `work_entries`
GROUP BY work_date
BETWEEN '2011-04-16' AND '2011-05-15';
-- Outputs
res
----
44
32
-- Should give
res
----
32
14
28
2
正しく動作するが、間違った間隔 (01 ~ 31 日) で動作する別の例:
SELECT
SUM(hour_count) AS res
FROM `work_entries`
GROUP BY MONTH(work_date);
-- Outputs
res
---
12
26
31
7
さらに、開始日と終了日を同時に出力する方法があれば、私もそれを望みますが、それはあまり重要ではありません。