2016-09-19 27 views
5

Tôi có một bảng có N cột.tổng trên nhiều cột

Tôi muốn có tổng của mỗi cột duy nhất:

SELECT 
    id 
, SUM(X1) as X1 
, SUM(X2) as X2 
, SUM(X3) as X3 
............ 
FROM test 

Tuy nhiên tôi không muốn liệt kê tất cả các cột vì tôi có quá nhiều trong số họ.

Có cách nào để tổng số tiền cho mỗi cột trong SQL Server không?

+0

Có vẻ như có nhiều cột không phải là cách tiếp cận tốt nhất. Bạn có thể có một hàng cho mỗi loại giá trị (X1, X2, X3) và sau đó nhận được những gì bạn cần bằng 'SELECT SUM (value) FROM test GROUP BY type' –

+0

Không phải trong SQL chuẩn - đó là _possible_ mà một số nhà cung cấp có cú pháp cho điều này nhưng không có gì tôi biết. Bạn có thể mã-gen nó hoặc chỉ cắn đạn và loại chúng ra - nó có thể sẽ mất ít thời gian hơn nó đã viết câu hỏi và sàng lọc thông qua các câu trả lời. –

+0

chỉ cần đặt, bạn không thể làm điều này..Bạn có thể 'sử dụng sql động, nhưng nó có thể phức tạp – TheGameiswar

Trả lời

0

được bạn yêu cầu này

x1 x2 x3 
2 3 4 
2 3 4 

4 6  8 --result 

sau đó thử mã này

SELECT 
    SUM(salary) as 'X1', 
    SUM(age) as 'X2', 
    SUM(mark) as 'X3' 
    FROM tsum 
1

Bạn có thể làm điều này với SQL Server:

thiết lập một sơ đồ thử nghiệm

create table p (id int, x1 int, x2 int, x3 int); 

insert into p values 
(1,1,0,1), 
(2,1,1,0), 
(3,1,0,1), 
(1,1,1,1); 

bây giờ là SQL

declare @stmt as nvarchar(600); 

set @stmt =  
(
select concat('select id,', (
     SELECT LEFT(column_names , LEN(column_names)-1) AS column_names 
    FROM information_schema.columns AS extern 
    CROSS APPLY 
    (
    SELECT concat('sum(',column_name , ') as ', column_name,',') 
    FROM information_schema.columns AS intern 
    WHERE extern.table_name = intern.table_name and column_name <> 'ID' 
    FOR XML PATH('') 
    ) pre_trimmed (column_names) 
    where table_name = 'p' 
    GROUP BY table_name, column_names 
    ), 
    ' from p group by id') 
    ); 


execute sp_executesql @stmt; 

Nếu bạn thêm hàng trăm cột khác, cột này sẽ hoạt động.

Bạn về cơ bản xây dựng một chuỗi truy vấn SQL và sau đó thực hiện nó.

Chìa khóa ở đây là tôi giả định rằng bạn có một cột ID và sau đó tất cả các cột Xn. Vì vậy, nếu bạn có một cột ref khác, hãy nói tên, rằng bạn không wan't tóm tắt bạn sẽ thay đổi truy vấn Information_Schema của bạn thành 'và column_name not in ('id','name') v.v.

Nếu điều này cũng là phù hợp, bạn có thể thêm mệnh đề where in the bên trong chọn để chỉ tổng các cột với Type Int.

Here is a working example

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