Сгруппировать и получить счет от 1 до многих таблиц - PullRequest
1 голос
/ 23 ноября 2010

У меня есть таблица, которая выглядит следующим образом

CREATE TABLE `purchases` (
    `id` INT(10) NOT NULL AUTO_INCREMENT,
    `totalAmount` INT(10) NOT NULL DEFAULT '0',
    `purchaseDate` DATETIME NOT NULL,
    PRIMARY KEY (`id`)
)

и другая таблица, в которой хранятся все детали покупок (например, линейные товары)

CREATE TABLE `purchase_items` (
    `id` INT(10) NOT NULL AUTO_INCREMENT,
    `purchaseId` INT(10) NOT NULL,
    `itemId` INT(10) NOT NULL DEFAULT '0',
    PRIMARY KEY (`id`),
    FOREIGN KEY (`purchaseId`) REFERENCES purchases(id)
)

Я получаю общее количествопокупки в любой день таким образом

SELECT DATE_FORMAT(purchaseDate, '%m-%d-%Y') AS date,
COUNT(id) AS totalPurchases
FROM purchases
GROUP BY DATE(purchaseDate)

Это дает мне результат как таковой

date        totalPurchases
11-18-2010  5
11-19-2010  10
11-20-2010  10

Как мне выполнить запрос так, чтобы он возвращал мне что-то вроде

date        totalPurchases  totalItems
11-18-2010  5               20
11-19-2010  10              30
11-20-2010  10              25

Таким образом, я все еще буду группировать по дате, но мне нужно выполнить объединение на элементе 'purchase_items' и получить общее количество элементов, которые были связаны с

  • 5 покупками за 11-18-2010
  • 10 покупок на 11-19-2010
  • 10 покупок на 11-20-2010

Ответы [ 3 ]

2 голосов
/ 23 ноября 2010

Использование:

  SELECT DATE_FORMAT(p.purchasedate, '%m-%d-%Y'),
         COUNT(p.id) AS totalPurchases,
         COUNT(pi.itemid) AS totalItems
    FROM PURCHASES p
    JOIN PURCHASE_ITEMS pi ON pi.purchaseid = p.id
GROUP BY DATE_FORMAT(p.purchasedate, '%m-%d-%Y')

Если возможно, что нет никакого отношения к таблицам PURCHASE_ITEMS, используйте:

   SELECT DATE_FORMAT(p.purchasedate, '%m-%d-%Y'),
          COUNT(p.id) AS totalPurchases,
          COUNT(pi.itemid) AS totalItems
     FROM PURCHASES p
LEFT JOIN PURCHASE_ITEMS pi ON pi.purchaseid = p.id
 GROUP BY DATE_FORMAT(p.purchasedate, '%m-%d-%Y')
1 голос
/ 23 ноября 2010

Редактировать -

SELECT DATE_FORMAT(A.purchaseDate, '%m-%d-%Y') AS date,
COUNT(A.id) AS totalPurchases,count(B.id)
FROM purchases A LEFT OUTER JOIN purchaseitems B on A.id = B.purchaseid
GROUP BY DATE(purchaseDate)
0 голосов
/ 23 ноября 2010

Попробуйте это:

select p.purchasedate, sum(p.id), items.items_count
from purchases p
cross apply
(
   select count(id) [items_count]
   from purchase_items
   where purchaseId = p.id
)items
group by p.purchasedate, items.items_count
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...