2013-02-04 70 views
1

如何在MySQL中构造查询来计算组的结果?所以,MySQL如何计算一次计数的结果?

表A

Month Item 
Jan   1 
Jan   3 
Feb   2 
Feb   2 
Mar   3 

表B

Item Color 
1  red 
1  blue 
2  black 
3  black 
3  yellow 

我想要一个查询,会告诉我在表A中的许多项目如何在表B中存在凡是有至少两种颜色每一个月。换句话说,每个月有超过2种颜色的商品有多少件。所以结果将是:

Month Results 
Jan  2 
Feb  0 
Mar  1 

谢谢。

+1

到目前为止你有什么?请编辑您的问题,以包括您已做出的任何尝试,但是一半已烘烤 – bernie

回答

0

尝试这样:

SELECT DISTINCT T.Month, COALESCE(T2.Cnt2,0) Cnt 
FROM (
    SELECT Month 
    FROM TableA 
) T LEFT JOIN (
    SELECT A.Month, COUNT(DISTINCT B.Color) Cnt, COUNT(DISTINCT B.Item) Cnt2 
    FROM TableA A 
     INNER JOIN TableB B ON A.Item = B.Item 
    GROUP BY A.Month 
    HAVING COUNT(DISTINCT B.Color) >= 2 
) T2 ON T.Month = T2.Month 

它使用GROUP BYHAVING得到TableA中和表B的DISTINCTCOUNT项目。要返回2月0日,您需要LEFT JOIN

这是SQL Fiddle

祝你好运。

2

如果我理解正确的问题,我认为下面的答案是:

select a.month, 
     (case when count(distinct b.color) >= 2 then COUNT(distinct a.item) else 0 end) 
from TableA a join 
    TableB b 
    on a.item = b.item 
group by a.month 

这计数的颜色在一个月的总数。如果2或更大,则它具有项目的数量。否则,它拥有0.1

+0

这可以计算每月不同颜色*,而OP似乎是每月*项目数量之后*,每个项目至少有两种颜色。我不认为没有两级分组就可以做到这一点。 –

+0

我没有仔细检查这个答案,当我给我的...但这是一个不错的主意。+1 – fthiella

+0

@AndriyM。 。 。我们用不同的方式解释这个说法,“每个月至少有两种颜色”。现在我看到你的解释,这也是有道理的。提问的人应该真正澄清。 –

1

此子查询返回所有至少有两种颜色的项目:

select Item 
from TableB 
group by Item 
having count(distinct Color)>1 

你还可以用TableA的加入,并将得到的查询是这样的:

select 
    A.Month, 
    Count(B.Item) 
from 
    TableA A left join (
    select Item 
    from TableB 
    group by Item 
    having count(distinct Color)>1) B 
    on A.Item=B.Item 
group by A.Month