2010-02-01 3 views
18

J'ai une requête MySQL qui renvoie une seule ligne qui est une série de 1 et 0. C'est pour un indicateur de progression. J'ai maintenant la sommation dans le code, mais j'ai essayé de faire la somme des valeurs dans une requête, et j'ai réalisé que je ne pouvais pas utiliser SUM(), car il y a beaucoup de colonnes mais seulement une ligne.Somme des valeurs d'une seule ligne?

Y a-t-il un moyen de résumer ceci automatiquement dans la requête? Il est comme ça:

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

Edit: J'ai oublié de mentionner, item_1 et ainsi de suite ne sont pas des valeurs de champ simples, mais chacun est plutôt une expression, comme SELECT IF(field_1 = 1 and field_2 IS NOT NULL, 0, 1) AS item_1 ..., donc il semble que je dois faire une requête imbriquée:

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?

Répondre

39
select item_1 + item_2 + item_3 + item_4 as ItemSum 
from MyTable 

S'il peut y avoir des valeurs nulles, vous aurez besoin de les traiter comme ceci:

select ifnull(item_1, 0) + ifnull(item_2, 0) + ifnull(item_3, 0) + ifnull(item_4, 0) as ItemSum 
from MyTable 
+0

Ah! Comme ce sont des expressions, et non des valeurs simples, je pourrais faire une requête imbriquée: SELECT (item_1 + item_2 ...) FROM (SELECT IF (champ_1 = y et champ_2 N'EST PAS NUL, 1, 0) AS item_1 ...) AS alias. Correct? – user151841

+0

Oui, ça va marcher. – RedFilter

4

Vous ne pouvez pas vraiment faire plus simple que:

SELECT item_1 + item_2 + item_3 + item_4 
FROM Table1 

Si vous avez beaucoup de colonnes, il faudra un certain temps pour taper. Je suppose qu'il a fallu beaucoup de temps pour créer la table aussi.

À l'avenir, concevez vos tables différemment afin que chaque étape du processus soit une ligne et non une colonne. En d'autres termes, au lieu de cela:

id, item_1, item_2, item_3, item_4 

Votre table pourrait ressembler à ceci:

id, item_number, value 

Et puis vous pouvez interroger comme ceci:

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

En fait, vous avez probablement n'avez même pas besoin de la colonne de valeur. La présence ou l'absence de la ligne est une information suffisante. Ainsi, votre requête devient:

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

Il est peut-être un peu tard pour vous cette fois-ci, mais si vous avez encore une chance de changer la conception, alors il pourrait être utile d'envisager cela.

+0

Je ne peux pas vraiment faire la table du design différent que vous décrivez, parce que chaque élément est en fait un drapeau booléen et une valeur, chacun de type différent. Les valeurs d'item_1 peuvent être de type date, item_2 une chaîne, etc. Je pourrais toujours mettre toutes ces valeurs dans un type de colonne à une seule chaîne, mais je ne pourrais pas faire de requêtes natives sur cette colonne, comme des calculs de date ou SUM(). – user151841

+0

Oui, s'il s'agit de types différents, ce serait une mauvaise idée de les mettre dans la même colonne. –

Questions connexes