请记住,我无法将表格正常化,因此我必须使用我所得到的内容。在表中,行与此
类似name | widget1 | widget2 | widget3
------+-----------+----------+----------
Joe | blue | red |
Jane | green | |
Bob | red | red | green
Susy | green | green |
我想要做的是计算小部件的总数(Joe有2个小部件,Jane有1个等),还要计算类似小部件的数量(Bob有3个小部件 - 2个红色和1个绿色, Susy有2个小部件 - 2个绿色等等)
这是我的代码来计算窗口小部件的总数:
SELECT (
SUM( IF(widget1 <> "", 1, 0) ) +
SUM( IF(widget2 <> "", 1, 0) ) +
SUM( IF(widget3 <> "", 1, 0) )
) AS totalWidgets FROM table
哪个工作正常。但是有更好的方法吗?另外,为了计算相似值的数量,我确信我可以这么类似但只是检查值是否相等......但它可能会变得非常冗长和复杂。
有更直接的方法吗?
答案 0 :(得分:2)
尚未测试,但应该可以使用
select name, count(1), SUM(widget = 'red') reds, SUM(widget = 'green') greens, SUM(widget = 'blue') blues
from
(
(SELECT name, widget1 widget FROM table)
UNION
(SELECT name, widget2 widget FROM table)
UNION
(SELECT name, widget3 widget FROM table)
)q
WHERE widget <> ''
group by name;
全部在一行
select name, count(1), SUM(widget = 'red') reds, SUM(widget = 'green') greens, SUM(widget = 'blue') blues from ((SELECT name, widget1 widget FROM table) UNION (SELECT name, widget2 widget FROM table) UNION (SELECT name, widget3 widget FROM table))q WHERE widget <> '' group by name;
q
是我们的标准化“表格”(不是真正的表格,但它看起来像一个)。
以这种方式查看我们的规范化表格
select * from ((SELECT name, widget1 widget FROM table) UNION (SELECT name, widget2 widget FROM table) UNION (SELECT name, widget3 widget FROM table))q;
不确定你称之为什么,我认为这是一个子查询。 (我已经使用MySQL多年了,我仍然不知道正确的名字)