4

Keep in mind that there's no way I can normalize the table, so I'm having to work with what I got. In the table, the rows are similar to this

name  |  widget1  |  widget2 | widget3 
------+-----------+----------+----------
Joe   |   blue    |   red    |          
Jane  |   green   |          |          
Bob   |   red     |   red    |  green
Susy  |   green   |  green   |   

What I'd like to do is count the total number of widgets (Joe has 2 widget, Jane has 1, etc), and also count the number of similar widgets (Bob has 3 widgets - 2 red and 1 green, Susy has 2 widgets- 2 green, etc)

Here's my code to count the total number of widgets:

SELECT ( 
         SUM( IF(widget1 <> "", 1, 0) ) +
         SUM( IF(widget2 <> "", 1, 0) ) +
         SUM( IF(widget3 <> "", 1, 0) )
       ) AS totalWidgets FROM table

Which works fine. But is there a better way to do this? Also, to count the number of similar of values, I'm sure I can so something similar but just check if the values are equal... but it could get pretty long and convoluted.

Is there a more direct approach?

1 Answer 1

2

Have not tested, but it should work

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;

All on one line

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 is our normalized "table" (not really a table, but it kinda looks like one).

See our normalized table this way

select * from ((SELECT name, widget1 widget FROM table) UNION (SELECT name, widget2 widget FROM table) UNION (SELECT name, widget3 widget FROM table))q;

Not sure what you call it, I think it is a subquery. (I have used MySQL for years and I still don't know the proper names)

Sign up to request clarification or add additional context in comments.

1 Comment

Brilliant! Worked perfectly. HeeHaw!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.