2010-02-01 27 views
18

Mam kwerendę MySQL, który zwraca jeden wiersz, który jest serią 1s i 0s. To dotyczy wskaźnika paska postępu. Mam to zsumowanie w kodzie, ale próbowałem zsumować wartości w zapytaniu i zdałem sobie sprawę, że nie mogę użyć funkcji SUM(), ponieważ jest to wiele kolumn, ale tylko jeden wiersz.Suma wartości jednego rzędu?

Czy istnieje sposób, w jaki mogę to automatycznie podsumować w zapytaniu? To jest tak:

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

Edit: Zapomniałem wspomnieć, item_1 i tak dalej, nie są prostymi wartości pól, ale każdy z nich jest raczej wyrazem, jak SELECT IF(field_1 = 1 and field_2 IS NOT NULL, 0, 1) AS item_1 ..., więc wygląda na to, co muszę zrobić zapytanie zagnieżdżone:

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

Prawidłowe?

Odpowiedz

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

Jeśli nie może być wartości null, musisz obsłużyć je tak:

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

Ah! Więc ponieważ są to wyrażenia, a nie proste wartości, mogę wykonać zapytanie zagnieżdżone: SELECT (item_1 + item_2 ...) FROM (SELECT IF (field_1 = yi field_2 IS NOT NULL, 1, 0) AS item_1 ...) AS alias. Poprawny? – user151841

+0

Tak, to zadziała. – RedFilter

4

Naprawdę nie można zrobić to prostsze:

SELECT item_1 + item_2 + item_3 + item_4 
FROM Table1 

Jeśli masz dużo kolumn, a wpisanie zajmie trochę czasu. Myślę, że utworzenie tabeli również zajęło dużo czasu.

W przyszłości zaprojektuj swoje stoły inaczej, aby każdy etap procesu był wierszem, a nie kolumną. Innymi słowy, zamiast tego:

id, item_1, item_2, item_3, item_4 

Twój stół mógłby wyglądać następująco:

id, item_number, value 

A potem można wyszukać go tak:

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

W rzeczywistości, prawdopodobnie nawet nie potrzebuję kolumny wartości. Obecność lub brak rzędu jest wystarczającą informacją. Więc zapytanie staje:

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

To może trochę późno dla ciebie tym razem, ale jeśli nadal mają szansę zmienić projekt, to może warto rozważyć to.

+0

Naprawdę nie mogę zrobić tabeli z innym projektem, który opisujesz, ponieważ każdy "element" w rzeczywistości jest flagą boolowską i wartością, a każdy z nich jest innego typu. Więc wartości item_1 mogą być typu daty, item_2 string itp. Nadal mogę umieścić wszystkie te wartości w jednym typie kolumny, ale wtedy nie mogłem wykonywać natywnych zapytań w tej kolumnie, takich jak obliczenia daty lub SUM(). – user151841

+0

Tak, jeśli są to różne typy, to niewłaściwym pomysłem byłoby umieszczenie ich w tej samej kolumnie. –

Powiązane problemy