You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用SQL查询返回各字段名及其对应的求和值?

当然可以实现!分两种方案给你参考,看哪种更适合你的情况:

方案一:手动编写(适合字段数量固定的场景)

因为你提到只有约20个字段,手动写其实很直接,而且兼容性极强,所有SQL数据库都支持。核心思路是用UNION ALL把每个字段的名称和求和结果拼接成多行数据:

SELECT 'field1' AS field_name, SUM(field1) AS field_sum FROM your_table
UNION ALL
SELECT 'field2' AS field_name, SUM(field2) AS field_sum FROM your_table
UNION ALL
SELECT 'field3' AS field_name, SUM(field3) AS field_sum FROM your_table
-- 依次添加剩下的field4到fieldN,直到所有需要求和的字段都写完

这个方法的好处是直观,不用依赖系统表,也不会有动态SQL的权限问题,写起来几分钟就能搞定20个字段。

方案二:动态生成SQL(适合字段可能变动的场景)

如果以后字段可能增减,不想每次都修改SQL,可以通过查询数据库的系统元数据表,动态生成求和语句。不同数据库的语法略有差异,下面给几个主流数据库的实现:

MySQL/MariaDB

SET @sql = NULL;
SELECT GROUP_CONCAT(
  CONCAT("SELECT '", column_name, "' AS field_name, SUM(", column_name, ") AS field_sum FROM your_table")
  SEPARATOR ' UNION ALL '
) INTO @sql
FROM information_schema.columns
WHERE table_schema = '你的数据库名'
  AND table_name = '你的表名'
  AND column_name NOT IN ('date', 'employee_id'); -- 排除不需要求和的字段

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

PostgreSQL

DO $$
DECLARE
  sql TEXT;
BEGIN
  SELECT string_agg(
    format('SELECT %L AS field_name, SUM(%I) AS field_sum FROM your_table', column_name, column_name),
    ' UNION ALL '
  ) INTO sql
  FROM information_schema.columns
  WHERE table_schema = 'public' -- 你的表所在的schema,通常是public
    AND table_name = '你的表名'
    AND column_name NOT IN ('date', 'employee_id');
  
  EXECUTE sql;
END $$;

SQL Server

DECLARE @sql NVARCHAR(MAX);
SELECT @sql = STRING_AGG(
  CONCAT(N'SELECT ''', column_name, ''' AS field_name, SUM(', column_name, ') AS field_sum FROM your_table'),
  N' UNION ALL '
)
FROM information_schema.columns
WHERE table_schema = 'dbo' -- 你的表所在的schema,通常是dbo
  AND table_name = '你的表名'
  AND column_name NOT IN ('date', 'employee_id');

EXEC sp_executesql @sql;

动态方案的好处是字段变动时无需修改代码,但需要你有查询系统元数据表的权限,而且不同数据库的语法不能通用。

内容的提问来源于stack exchange,提问作者ruda

火山引擎 最新活动