0

2 つのテーブルを持つデータベースがあります。最初の ('calendar') には、'2012-12-25' のような将来の一連の日付のみが含まれます。これはプロシージャによって生成されました。2 番目 ('new_allocations') には、一連の在庫割り当てが含まれています。サンプル コンテンツは次のようになります。

+----+-------------+------------+----------+------------+
| id | delivery_ID | date       | quantity | product_ID |
+----+-------------+------------+----------+------------+
|  1 |           1 | 2012-11-09 |        5 |          2 |
|  2 |           1 | 2012-11-08 |        5 |          2 |
|  3 |           2 | 2012-11-07 |        5 |          2 |
|  4 |           3 | 2012-11-06 |        5 |          2 |
|  5 |           4 | 2012-11-03 |        2 |          2 |
|  6 |           4 | 2012-11-02 |        5 |          2 |
|  7 |           5 | 2012-11-03 |        3 |          2 |
|  8 |           6 | 2012-11-05 |        5 |          2 |
|  9 |           7 | 2012-11-07 |       55 |          5 |
| 10 |           7 | 2012-11-06 |       34 |          5 |
| 11 |           7 | 2012-11-05 |       40 |          5 |
+----+-------------+------------+----------+------------+

次のクエリ (基本的には、「指定された日付範囲内の日のリストを、日曜日を除いて、その日の在庫割り当ての合計とともに表示する」ことを意味します) は、すべての製品 ( '製品番号')。

select datefield as Date, sum(ifnull(quantity,0)) as Qty from calendar left join new_allocations on (new_allocations.date=calendar.datefield) where (calendar.datefield>='2012-10-29' and calendar.datefield<='2012-11-10') and dayname(calendar.datefield) != 'Sunday' group by datefield;

+------------+------+
| Date       | Qty  |
+------------+------+
| 2012-10-29 |    0 |
| 2012-10-30 |    0 |
| 2012-10-31 |    0 |
| 2012-11-01 |    0 |
| 2012-11-02 |    5 |
| 2012-11-03 |    5 |
| 2012-11-05 |   45 |
| 2012-11-06 |   39 |
| 2012-11-07 |   60 |
| 2012-11-08 |    5 |
| 2012-11-09 |    5 |
| 2012-11-10 |    0 |
+------------+------+

したがって、私の問題は、「and product_ID='2'」を追加するとすぐに、クエリが範囲内のすべての日付を返さなくなることです。

新しいクエリ:

select datefield as Date, sum(ifnull(quantity,0)) as Qty from calendar left join new_allocations on (new_allocations.date=calendar.datefield) where (calendar.datefield>='2012-10-29' and calendar.datefield<='2012-11-10') and dayname(calendar.datefield) != 'Sunday' and product_ID='2' group by datefield;

新しい結果:

+------------+------+
| Date       | Qty  |
+------------+------+
| 2012-11-02 |    5 |
| 2012-11-03 |    5 |
| 2012-11-05 |    5 |
| 2012-11-06 |    5 |
| 2012-11-07 |    5 |
| 2012-11-08 |    5 |
| 2012-11-09 |    5 |
+------------+------+

実際、私が欲しいものは次のようになります。

+------------+------+
| Date       | Qty  |
+------------+------+
| 2012-10-29 |    0 |
| 2012-10-30 |    0 |
| 2012-10-31 |    0 |
| 2012-11-01 |    0 |
| 2012-11-02 |    5 |
| 2012-11-03 |    5 |
| 2012-11-05 |    5 |
| 2012-11-06 |    5 |
| 2012-11-07 |    5 |
| 2012-11-08 |    5 |
| 2012-11-09 |    5 |
| 2012-11-10 |    0 |
+------------+------+

私はこれを行ったり来たりしましたが、クエリを正しく表現できませんでした。何が欠けていますか?

よろしくお願いします。

CREATE TABLE `new_allocations` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `delivery_ID` int(11) DEFAULT NULL,
  `date` date DEFAULT NULL,
  `quantity` int(11) DEFAULT NULL,
  `product_ID` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
)

INSERT INTO `new_allocations` (`id`, `delivery_ID`, `date`, `quantity`, `product_ID`)
VALUES
    (1,1,'2012-11-09',5,2),
    (2,1,'2012-11-08',5,2),
    (3,2,'2012-11-07',5,2),
    (4,3,'2012-11-06',5,2),
    (5,4,'2012-11-03',2,2),
    (6,4,'2012-11-02',5,2),
    (7,5,'2012-11-03',3,2),
    (8,6,'2012-11-05',5,2),
    (9,7,'2012-11-07',55,5),
    (10,7,'2012-11-06',34,5),
    (11,7,'2012-11-05',40,5);

カレンダーの場合:

DROP TABLE IF EXISTS `calendar`;
CREATE TABLE `calendar` (
  `datefield` date DEFAULT NULL
)

カレンダーを埋める手順:

DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `fill_calendar`(start_date DATE, end_date DATE)
BEGIN
  DECLARE crt_date DATE;
  SET crt_date=start_date;
  WHILE crt_date < end_date DO
    INSERT INTO calendar VALUES(crt_date);
    SET crt_date = ADDDATE(crt_date, INTERVAL 1 DAY);
  END WHILE;
END;;
DELIMITER ;
4

1 に答える 1

1

ON句ではなく、句にWHERE条件を追加します。

SELECT  datefield AS Date, COALESCE(SUM(quantity), 0) AS Qty
FROM    calendar
LEFT JOIN
        new_allocations
ON      new_allocations.date = calendar.datefield
        AND product_ID = '2'
WHERE   calendar.datefield BETWEEN '2012-10-29' AND '2012-11-10'
        AND dayname(calendar.datefield) != 'Sunday'
GROUP BY
        datefield

WHERE結合の結果をフィルタリングします。特定の日付に割り当てがなかった場合、左結合により、すべてのnew_allocationsフィールド ( を含むproductId) が に設定された日付の 1 つのレコードが生成されNULLます。

于 2012-11-03T21:52:01.760 に答える