2017-02-22 35 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的想法是对的! –