2017-02-22 68 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

首先非常感謝您的關注。我想在一列中計算它。計算一年中每月有多少個uniq項目。不,這不是一個糟糕的設計。這些數據來自不同來源,可能是一天或兩天,或全部四天。 –

回答

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 where(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)ORDER BY date_format(str_to_date(Date_of_flight,'%d。%m。%Y'),'%Y-%m-%d');'**和這樣的Event_1,我有4個:Event_1,Event_2,Event_3和Event_4。 –

+0

你的意思是「只有1列纔好」?如果您提供一些示例數據(您可以使用http://sqlfiddle.com)和您嘗試的查詢,我認爲我可以更好地幫助您。 – fancyPants

0

使用UNION ALL將該值作爲列獲取,並使用GROUP_CONCATCONCAT的組合。

查詢

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

謝謝使用union的想法是對的! –