Не тестировал, но он должен работать
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 в течение многих лет, и я все еще не знаю собственных имен)