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ó 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' –
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. –
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