2010-02-01 3 views
18

일련의 1과 0 인 단일 행을 반환하는 MySQL 쿼리가 있습니다. 진행률 표시기입니다. 나는 지금 코드에서 그것의 합계를 가지고 있지만, 쿼리의 값을 합산하려고 시도하고 SUM()을 사용할 수 없다는 것을 깨달았습니다. 왜냐하면 그것들은 많은 열이지만 단 하나의 행이기 때문입니다.단일 행의 합계 값?

쿼리에서 자동으로 합계 할 수있는 방법이 있습니까? 내가 item_1을 언급하는 것을 잊었다 등 간단한 필드 값은 아니지만, 내가해야 할 것 같습니다 그래서 각각 SELECT IF(field_1 = 1 and field_2 IS NOT NULL, 0, 1) AS item_1 ...로, 오히려 그런 식입니다

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

편집 : 그것은이처럼 중첩 쿼리 :

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

맞습니까? null 값이있을 경우

답변

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

,이 같은 그들을 처리해야합니다 :

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

아! 그래서 그들은 단순한 값이 아닌 표현식이므로 중첩 된 쿼리를 수행 할 수 있습니다. SELECT (item_1 + item_2 ...) FROM (SELECT IF (field_1 = y 및 field_2 IS NOT NULL, 1, 0) as item_1 ...) 별칭. 옳은? – user151841

+0

네, 그게 효과가 있습니다. – RedFilter

4

당신은 정말 할 수없는 그 어떤 단순한 이상 :

SELECT item_1 + item_2 + item_3 + item_4 
FROM Table1 

하는 경우 당신은 많은 컬럼을 가지고 있습니다. 그러면 테이블을 생성하는 데 꽤 오랜 시간이 걸렸을 것입니다.

미래에 테이블을 다르게 설계하여 프로세스의 각 단계가 열이 아닌 행이되도록하십시오. 대신이의 즉 :

id, item_number, value 

을 그리고 당신은이처럼 조회 할 수 있습니다 :

id, item_1, item_2, item_3, item_4 

테이블은 다음과 같이 볼 수 있었다 사실

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

, 당신 아마 값 열도 필요하지 않습니다. 행의 유무는 충분한 정보입니다. 그래서 쿼리가된다 :

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

그것은 당신을 위해 조금 늦게 아마이 시간,하지만 여전히 디자인을 변경할 수있는 기회가 있다면, 다음이 고려 가치가있을 수도 있습니다.

+0

각각의'item'은 사실 부울 플래그와 값을 가지기 때문에 설명하는 다른 디자인의 테이블을 실제로 만들 수는 없습니다. 그래서 item_1의 값은 날짜 유형, item_2 문자열 등일 수 있습니다. 나는 여전히 모든 값을 단일 문자열 열 유형에 넣을 수 있지만 그 다음 날짜 계산이나 SUM과 같은 열에 대한 원시 쿼리를 수행 할 수 없었습니다(). – user151841

+0

예, 유형이 다른 경우 동일한 열에 넣는 것은 좋지 않습니다. –