为简单起见,我有一个包含这些数据的表格:
Color Temp Value
----- ---- -----
red hot 1
red cold 1
red mild 2
red hot 2
red cold 3
blue hot 1
blue cold 2
blue hot 2
blue mild 3
blue hot 3
blue cold 2
green hot 1
yellow hot 1
yellow mild 1
yellow cold 4
yellow hot 3
reddish hot 1
reddish mild 3
reddish cold 4
purple hot 1
purple mild 3
purple cold 2
我想查询表分组并计算每种颜色的出现次数并有这种排除
1)排除少于2次出现的群体,因此我想排除"绿色"组
2)排除该组中至少有一行包含" 4"在"值"柱。因此,排除"黄色"并且"带红色"组
3)当表格中至少有一行存在类似书写的颜色(LIKE' color%'?)时,排除组,其中" 4"在"值"柱。因此我想排除" red"组,因为有一排颜色" reddish"和价值" 4"
所以在我放的示例数据中,我希望我的查询只返回:
Color Count(*)
----- --------
blue 6
purple 3
我怀疑这个查询应该使用JOIN子句的混合,使用变量和/或子查询可能LIKE CONCAT,但所有这些对我来说都是新的,所以我似乎无法到达一个有效的查询。或者它可能比这简单得多。
有人知道怎么写这个查询吗? 非常感谢。
答案 0 :(得分:1)
您可以使用HAVING
子句设置聚合条件。对于前两个条件,查询将如下所示:
SELECT color, COUNT(*) AS colorCount
FROM myTable
GROUP BY color
HAVING COUNT(*) >= 2 AND SUM(val = 4) = 0;
此查询仅返回至少有2行的组的计数,并且没有值= 4的行。最后一个条件有点棘手,我认为你不能使用{{1 }。clause。
我要做的是首先将此视为一个单独的问题,然后再进行处理。要获取val = 4的所有行,请尝试以下操作:
HAVING
一旦你拥有了它,你可以加入它的相关颜色,如下所示:
SELECT DISTINCT color
FROM myTable
WHERE val = 4;
在您的示例中,上面的查询将返回“red”。因此,要从最终结果中排除红色,您可以使用SELECT DISTINCT m.color
FROM myTable m
JOIN(
SELECT DISTINCT color
FROM myTable
WHERE val = 4) tmp ON tmp.color LIKE CONCAT(m.color, '%');
运算符。我在第一个结果集上使用了该运算符,以便仅在生成的聚合行上检查条件:
NOT IN
以下是您的示例数据的SQL Fiddle示例。