Получение сгруппированных данных в формате столбца, а не по строкам из запроса MySQL
Трудно сделать более описательный заголовок для этого. Я потратил пару часов на это сейчас и решил, что лучше спросить кого-то!
У меня есть 3 таблицы, которые выглядят примерно так
Место проживания:
id | name
1 | Plymouth
2 | Torquay
etc
salesRecords
itemId | saleDate (unix) | qty | saleLocation |
123 | UNIXTIMESTAMP | 1 | 1 |
458 | UNIXTIMESTAMP | 4 | 2 |
215 | UNIXTIMESTAMP | 2 | 2 |
541 | UNIXTIMESTAMP | 1 | 1 |
товары
itemId | brand |
123 | 1 | etc
Очевидно, что каждая таблица на самом деле содержит больше данных, чем это, но это все, что требуется для этого.
Что мне нужно, это вывод, который может сказать мне, сколько из каждого предмета или группы предметов продано определенному местоположению. Мне нужно что-то похожее на это:
ВЫХОД
mnth | yr | location1Sales | location2Sales
10 | 2006 | 14 | 7
11 | 2006 | 13 | 12
12 | 2006 | 8 | 1 ... etc
Вопрос, который я разместил здесь вчера:
MySQL подзапрос, чтобы получить список идентификаторов из одной таблицы для запроса второй таблицы
Был любезно ответил и дал мне довольно эффективный запрос для получения TOTAL
объединенных продаж по всем местоположениям (нет данных о местоположении, связанных с запросом, опубликованным во вчерашнем вопросе), и это работает отлично.
Я могу, конечно, добавить дополнительный пункт к WHERE
и получить только данные одного местоположения, но я хочу, чтобы все они были в одной таблице.
Сегодня я пытаюсь добавить предложение группировки / куда, чтобы добавить местоположения в запрос, но не могу понять, как создать таблицу в формате выше.
Я дошел до получения данных о местоположении в строках, но мне нужно в форме столбца, как указано выше
SELECT DAY( FROM_UNIXTIME( saleDate ) ) AS
DAY , MONTH( FROM_UNIXTIME( saleDate ) ) AS mnth,
YEAR( FROM_UNIXTIME( saleDate ) ) AS yr,
COUNT( s.id ) AS invCount, locations.name,
s.location, SUM( quantity ) AS saleQty
FROM salesRecords s
LEFT JOIN locations ON locations.id = s.location
INNER JOIN products ON s.itemNo = products.id
WHERE products.brand = '313' <=== X
AND s.location LIKE '1\_%' <=== XX
GROUP BY `locations`.`name` , mnth, yr
X: идентификатор бренда - это переменная, необходимая для группировки товаров по бренду
XX: местоположения запрашиваются следующим образом, поскольку saleLocation хранится в дБ в виде "locationId_tilId"
так как продажи отслеживаются по til, хотя для целей этих данных мне нужны все только по идентификатору местоположения, я не имею отношения к tilId
Я пытаюсь получить эти данные и превратить их в массив Javascript, чтобы я мог использовать блестящий плагин amCharts для построения диаграммы.
1 ответ
select
year( FROM_UNIXTIME( saleDate )) as yr,
month( FROM_UNIXTIME( saleDate )) as mnth,
sum( if( saleLocation = 1, qty, 0 )) as Location1Sales,
sum( if( saleLocation = 2, qty, 0 )) as Location1Sales
from
salesRecords
group by
year( FROM_UNIXTIME( saleDate )),
month( FROM_UNIXTIME( saleDate ))
Если у вас есть другие торговые точки, просто добавьте их в конструкции SUM( IF())...