2010-02-01 8 views
18

Tôi có một truy vấn MySQL trả về một hàng đơn lẻ là một chuỗi số 1 và 0. Nó cho một chỉ số thanh tiến trình. Bây giờ tôi đã tổng hợp nó trong mã, nhưng tôi đã cố tổng hợp các giá trị trong một truy vấn và nhận ra rằng tôi không thể sử dụng hàm SUM(), vì chúng có nhiều cột nhưng chỉ một hàng.Giá trị tổng của một hàng?

Có cách nào tôi có thể tự động tính tổng số tiền này trong truy vấn không? Nó như thế này:

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

Edit: Tôi quên đề cập đến, item_1 và vân vân là không giá trị trường đơn giản, nhưng mỗi thay vì là một biểu hiện, chẳng hạn như SELECT IF(field_1 = 1 and field_2 IS NOT NULL, 0, 1) AS item_1 ..., vì vậy nó trông giống như tôi phải làm một truy vấn lồng nhau:

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

đúng?

Trả lời

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

Nếu có thể có giá trị null, bạn sẽ cần phải xử lý chúng như thế này:

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

Ah! Vì vậy, vì chúng là các biểu thức, và không phải là các giá trị đơn giản, tôi có thể thực hiện một truy vấn lồng nhau: SELECT (item_1 + item_2 ...) FROM (SELECT IF (field_1 = y và field_2 IS NOT NULL, 1, 0) AS item_1 ...) AS bí danh. Chính xác? – user151841

+0

Có, điều đó sẽ hiệu quả. – RedFilter

4

Bạn có thể không thực sự làm điều đó bất cứ đơn giản hơn:

SELECT item_1 + item_2 + item_3 + item_4 
FROM Table1 

Nếu bạn có rất nhiều cột sau đó sẽ mất một lúc để nhập. Tôi đoán phải mất khá nhiều thời gian để tạo bảng.

Trong tương lai, thiết kế các bảng của bạn khác nhau sao cho mỗi giai đoạn của quy trình là một hàng không phải là một cột. Nói cách khác, thay vì điều này:

id, item_1, item_2, item_3, item_4 

bảng bạn có thể trông như thế này:

id, item_number, value 

Và sau đó bạn có thể truy vấn nó như thế này:

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

Trong thực tế, bạn có thể thậm chí không cần cột giá trị. Sự hiện diện hay vắng mặt của hàng là đủ thông tin. Vì vậy, truy vấn của bạn sẽ trở thành:

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

Có lẽ hơi muộn cho bạn lần này, nhưng nếu bạn vẫn có cơ hội thay đổi thiết kế thì có thể đáng xem xét điều này.

+0

Tôi không thể thực sự làm bảng của thiết kế khác nhau mà bạn mô tả, bởi vì mỗi mục 'thực sự là một cờ boolean và một giá trị, mỗi một loại khác nhau. Vì vậy, giá trị của item_1 có thể là một loại ngày, item_2 một chuỗi, v.v. Tôi vẫn có thể đặt tất cả các giá trị đó trong một loại cột chuỗi, nhưng sau đó tôi không thể thực hiện truy vấn gốc trên cột đó, chẳng hạn như tính toán ngày hoặc SUM(). – user151841

+0

Có, nếu chúng là các loại khác nhau, thì bạn nên đặt chúng vào cùng một cột. –