2015-05-28 22 views
5

Đây là một cái nhìn rất cơ bản tại bảng của tôi. Tôi có các cột 1 và 2 và cần tạo cột 3. Cột 3 chỉ đơn giản là tổng của cột Number cho tất cả Name chia cho Number cho hàng đã cho.Nhận tổng cột và sử dụng để tính phần trăm của tổng số (mySQL)

| Name   | Number  | % of total | 
| ------------- |:-------------:| -----:  | 
| Bob   | 5    | 25   | 
| Sally   | 10   | 50   | 
| John   | 5    | 25   | 

Tôi đang vật lộn với cách lấy tổng số hàng và sử dụng giá trị này làm giá trị để tính phần còn lại.

EDIT: Tôi đang tìm cách thực hiện điều này dưới dạng một truy vấn thay vì hai truy vấn riêng biệt nếu có thể.

+0

Bạn có tổng số tiền của các cột thứ hai trước không? – SalmonKiller

+0

@SalmonKiller Không, tôi không biết. Đó là phần khó khăn (đối với tôi). Đang cố gắng để có được giá trị đó và sau đó sử dụng tất cả trong một truy vấn. – jonmrich

Trả lời

5

Bạn chỉ cần CROSS JOIN các SUM() của Number cột:

SELECT Name, Number, Number * 100/t.s AS `% of total` 
FROM mytable 
CROSS JOIN (SELECT SUM(Number) AS s FROM mytable) t 

Demo Here

+0

Điều này làm việc cho tôi ... cảm ơn! Một câu hỏi. Nếu tôi muốn thêm mệnh đề 'WHERE' (chẳng hạn như' WHERE name = "Bob" '), nó sẽ đi đâu? Tôi đã cố gắng để đặt nó sau 'TỪ mytable', nhưng nhận được lỗi. – jonmrich

+0

@jonmrich Tùy thuộc vào nội dung bạn muốn lọc. Có phải các hàng mà 'SUM' được áp dụng cho? Sau đó, bạn phải làm điều đó trong 'SELECT' của' CROSS JOIN'. Nếu không, 'WHERE' phải được đặt * sau *' CROSS JOIN'. –

+0

Như bạn có thể tưởng tượng, bảng thực sự của tôi phức tạp hơn nhiều so với điều này. Tôi có nhiều cột có cùng tên (đại diện cho cùng một người) và tôi cần phải thêm từng trường hợp này lại với nhau (ví dụ: tổng số cho Bob) và chia số này cho tổng số cột 'Số'. Đây là nơi tôi bị treo lên tôi nghĩ. – jonmrich

3

Bạn có thể lấy nó với một subselect:

SELECT Name, Number, Number * 100/(select sum(Number) FROM MYTABLE) AS '% of total' 
FROM mytable 
3

Nếu tôi được làm điều này, tôi sẽ bắt đầu bằng cách lưu trữ một biến giữ tổng số, như sau:

SET @total := (SELECT SUM(number) FROM myTable); 

Một khi tôi đã biến đó, tôi có thể chạy một truy vấn mà có tỷ lệ phần trăm cho mỗi hàng như thế này:

SELECT name, number, (number/@total) * 100 AS percentage 
FROM myTable; 

Nếu bạn không muốn sử dụng một biến, bạn chỉ có thể di chuyển mà truy vấn con vào câu chọn lựa chọn của bạn:

SELECT name, number, (number/(SELECT SUM(number) FROM myTable)) * 100 AS percentage 
FROM myTable; 

Đây là ví dụ SQL Fiddle với mỗi phương pháp.

+0

Tôi chưa bao giờ làm việc với việc lưu trữ một biến. Nó được lưu trong bao lâu? Tôi có thể viết qua nó không? Tôi có cần chạy các truy vấn này trong các truy vấn riêng biệt không? Nhiều câu hỏi ... – jonmrich

+1

@jonmrich Họ là nếu tôi không nhầm lẫn chạy một cách riêng biệt, mà tôi thấy bây giờ trong chỉnh sửa của bạn, bạn có thể không muốn điều đó. Nó hữu ích hơn trong một thủ tục lưu trữ mà tôi tin. Theo như bao lâu nó được lưu trữ, tôi không chắc chắn. Nó có thể chỉ là phần hiện tại của bạn – AdamMc331

+1

Có nó ... điều tốt để biết cho tương lai mặc dù ngay cả khi nó không áp dụng ở đây. – jonmrich

Các vấn đề liên quan