用于仅使用星号计算数值类型列的聚合值的 SQL 查询



假设我有一个具有异构列(varchar,int等(的表。

+-------+----+----+----+
| Nme   | Py | cm | Mt |
+-------+----+----+----+
| johny | 68 | 70 | 66 |
| Harry | 86 | 76 | 90 |
| johny | 18 | 72 | 66 |
+-------+----+----+----+

并且需要计算每个整数列的总和,但使用一些通用的 SQL 查询,这样即使我添加新的整数列,我也不必更改查询。

我需要什么,但以通用形式

SELECT SUM(Py), SUM(cm), SUM(Mt) FROM table GROUP BY NME;

像这样:

SELECT SUM(*) FROM table WHERE <COLUMNTYPE(INT)> GROUP BY NME;

有没有办法在SQL中解决或不可能?

没有这样的事情。 您似乎误解了如何使用SQL。 我认为您需要一个"取消透视"数据的表。 像这样:

create table personValues (
personValues int auto_increment primary key,
person varchar(255),
value_type varchar(255),
value int
);

因此,现在的一行将是三行。 然后,您将在不同的行中获得结果,但您确实会得到结果:

select value_type, sum(value)
from personValues
group by value_type;

如果需要将其透视为单行,则有两个选项:

  • 使用动态 SQL 的透视。
  • 使用group_concat()创建长字符串。

如果你想为此尝试动态sql?

下面是 MySql 的示例代码片段:

-- Adding a test table
drop table if exists test_dynamic;
create table test_dynamic (ID int auto_increment primary key, Nme varchar(30), Py int, Cm int, Mt int);
-- Some sample data
insert into test_dynamic (Nme, Py, Cm, Mt) values
('johny',68,70,66),
('Harry',86,76,90),
('johny',18,72,66);
-- Build a string for the aggregations
set @Sums := (select group_concat(concat(' SUM(', column_name, ') as ', column_name)) as sums
from information_schema.columns
where table_schema = database() 
and table_name = 'test_dynamic'
and data_type = 'int'
and column_key != 'PRI');
-- Stick it to a string for the select
set @DynSql := concat('select 
Nme, 
', @Sums, '
from test_dynamic
group by Nme
order by Nme');
-- Run the created dynamic sql string
PREPARE stmt FROM @DynSql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

返回:

Nme     Py  Cm  Mt
----    --  --  --
Harry   86  76  90
johny   86  142 132

此代码块在 sql 服务器中工作

没有单个 sql 语句可以执行此任务。

BEGIN
DECLARE @ColumnSUM nvarchar(max) = 'NME'
SELECT @ColumnSUM += ', SUM(' + COLUMN_NAME + ') ' + COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'test_dynamic'
AND DATA_TYPE = 'int'
AND COLUMN_NAME != 'ID'
EXEC('SELECT ' + @ColumnSUM + ' FROM test_dynamic GROUP BY NME ORDER BY NME')
END 

结果:

NME     Py  Cm  Mt
---     --  --  --
Harry   86  76  90
johny   86  142 132

相关内容

  • 没有找到相关文章

最新更新