2017-02-22 32 views
1

Добрый день, дорогие коллеги!Данные группы MySQL из трех столбцов

Возможно, кто-нибудь скажет мне, как сделать группу из 3 столбцов? Например, в одной таблице есть три столбца одного типа A, B, C, в которых хранятся одни и те же данные, такие как «хлеб», «вода», «шоколад». А также у нас есть столбец даты.

Это выглядит следующим образом:

Col_A  | Col_B  | Col_C | Date  
--------- | --------- | ------- | ---------- 
Bread  | Null  | Water | 19.01.2016 
Bread  | Bread  | Water | 22.02.2016 
Chocolate | Chocolate | Null | 18.03.2016 

И я хочу, чтобы подсчитать, сколько продуктов продано сгруппированы по месяцам? Ожидая результат:

January -> Bread 1, Water 1 
February ->Bread 2, Water 1 
March -> Chocolate 2 

Для одной колонки я использовал запрос как:

SELECT A, COUNT(A) FROM MyDB GROUP BY month(Date) 

Но я не знаю, как рассчитать для 3 колонки во время? Спасибо за любую помощь заранее!

+0

вы хотите, чтобы все эти результате столбца в одной строке или множественной строке ?? –

+0

*, которые хранят данные того же типа * это симптоматично плохой дизайн – Strawberry

+0

Прежде всего, спасибо вам за интерес. 1. Я хочу рассчитать его в одной колонке. Рассчитайте, сколько единиц единиц было в каждом месяце года. 2. Нет, это не плохой дизайн. Эти данные из разных источников и могут составлять один или два или все четыре в один день. –

ответ

1

Вы должны поместить их все в одну колонку, конечно :)

SELECT my_column, COUNT(my_column) FROM (
    SELECT Col_A AS my_column FROM your_table 
    UNION ALL 
    SELECT Col_B FROM your_table 
    UNION ALL 
    SELECT Col_C FROM your_table 
) sq 
GROUP BY my_column; 

Также вы должны рассмотреть, чтобы перестроить свою базу данных. Как вы видите, эта таблица субоптимальна.

+0

В чем проблема? Вы используете MySQL 5.7? С 5.7. скобки нужны вокруг каждого оператора SELECT в подзапросе (объединенные). – fancyPants

+0

Спасибо за помощь. Я использую MySQL 5.5.54. И использованный запрос, который работает сейчас, но это нормально только для 1 колонки. ** 'SELECT Event_1, COUNT (Event_1), Date_of_flight FROM flightdata где (date_format (str_to_date (Date_of_flight, '% d.% M.% Y'), '% Y-% m-% d')> = '2016- 01-01 'и date_format (str_to_date (Date_of_flight,'% d.% M.% Y '),'% Y-% m-% d ') <' 2018-01-01 ') GROUP BY month (Date_of_flight) ЗАКАЗАТЬ BY date_format (str_to_date (Date_of_flight, '% d.% M.% Y'), '% Y-% m-% d'); '** и такое событие_1, у меня есть 4: Event_1, Event_2, Event_3 и Event_4. –

+0

Что вы подразумеваете под «это нормально только для 1 колонки»? Я думаю, что я могу помочь вам лучше, если вы предоставите некоторые примеры данных (вы можете использовать http://sqlfiddle.com) и запрос, который вы попробовали. – fancyPants

0

Используйте UNION ALL, чтобы получить стоимость в виде столбца и используйте комбинацию GROUP_CONCAT и CONCAT.

Запрос

select z.`Month`, group_concat(concat(z.`Col`, ' ', z.`Count`) separator ', ') `Col` from(
    select t.`Date`, monthname(t.`Date`) as `Month`, t.`Col`, count(t.`Col`) as `Count` from(
    select `Col_A` as `Col`, `Date` from `your_table_name` 
    union all 
    select `Col_B`, `Date` from `your_table_name` 
    union all 
    select `Col_C`, `Date` from `your_table_name` 
)t 
    group by monthname(t.`Date`), t.`Col` 
)z 
group by z.`Month` 
order by month(z.`Date`); 

SQL Fiddle

+0

Спасибо! Я буду экспериментировать с ним, и обратная связь вы. –

+0

Спасибо, что с помощью союза правильно! –