tags:

views:

194

answers:

2

I have a MySQL query that returns a single row that is a series of 1s and 0s. It's for a progress bar indicator. I have the summing of it in code now, but I tried to sum the values in a query, and realized I couldn't use SUM(), because they're many columns but just one row.

Is there a way I can sum this automatically in the query? It's like this:

item_1 | item_2 | item_3 | item_4
-------+--------+--------+--------
     1 |      1 |      0 |      0

Edit: I forgot to mention, item_1 and so forth are not simple field values, but each is rather an expression, such as SELECT IF( field_1 = 1 and field_2 IS NOT NULL, 0, 1 ) AS item_1 ..., so it looks like I have to do a nested query:

SELECT ( item_1 + item_2 ... ) FROM ( SELECT IF( field_1 = y and field_2 IS NOT NULL, 1, 0 ) AS item_1 ... ) AS alias

Correct?

+4  A: 
select item_1 + item_2 + item_3 + item_4 as ItemSum
from MyTable

If there can be null values, you'll need to handle them like this:

select ifnull(item_1, 0) + ifnull(item_2, 0) + ifnull(item_3, 0) + ifnull(item_4, 0) as ItemSum
from MyTable
RedFilter
Ah! So since they are expressions, and not simple values, I could do a nested query: SELECT ( item_1 + item_2 ... ) FROM ( SELECT IF( field_1 = y and field_2 IS NOT NULL, 1, 0 ) AS item_1 ... ) AS alias. Correct?
Yes, that will work.
RedFilter
+1  A: 

You can't really do it any simpler than:

SELECT item_1 + item_2 + item_3 + item_4
FROM Table1

If you have a lot of columns then it will take a while to type in. I guess it took quite a long time to create the table too.

In future design your tables differently so that each stage of the process is a row not a column. In other words, instead of this:

id, item_1, item_2, item_3, item_4

Your table could look like this:

id, item_number, value

And then you can query it like this:

SELECT SUM(value)
FROM Table1
WHERE id = @id

In fact, you probably don't even need the value column. The presence or absence of the row is enough information. So your query becomes:

SELECT COUNT(*)
FROM Table1
WHERE id = @id

It's perhaps a bit late for you this time, but if you still have a chance to change the design, then it might be worth considering this.

Mark Byers
I can't really do the table of the different design you describe, because each `item` actually is a boolean flag and a value, each one a of different type. So item_1's values might be of a date type, item_2 a string, etc. I still could put all those values in a single string column type, but then I couldn't do native queries on that column, such as date calculations, or SUM().
Yes, if they are different types, then it would be a bad idea to put them in the same column.
Mark Byers