子查询中的动态字段名称?

use*_*665 6 sql postgresql unpivot dynamic-sql aggregate-functions

我有一个类似于以下的表:

CREATE TABLE stats (
  name character varying(15),
  q001001 numeric(9,0),
  q001002 numeric(9,0),
  q001003 numeric(9,0),
  q001004 numeric(9,0),
  q001005 numeric(9,0)
)
Run Code Online (Sandbox Code Playgroud)

我需要在这个表中查询各个字段的总和,如下所示:

SELECT sum(q001001) as total001,
       sum(q001002) as total002,
       sum(q001005) as total005,
FROM stats;
Run Code Online (Sandbox Code Playgroud)

这会产生一行数据和三列数据.
但是,出于报告目的,我需要以相反的方式列出结果.我需要三行和一列(好吧,实际上是两个,第一个是总和的字段),如下所示:

FieldName | SUM
----------+-------
q001001   |  12345
q001002   |  5432
q001005   |  986
Run Code Online (Sandbox Code Playgroud)

我想使用这样的一些SQL,其中field_name(来自stats表中字段名称的查找表)用于子查询:

select l.field_name, (select sum(l.field_name) from stats)
from stats_field_names_lookup as l
where l.field_name in ('Q001001', 'Q001002', 'Q001005');
Run Code Online (Sandbox Code Playgroud)

这里的想法是,sum(l.field_name)将替换为相关的实际字段名称,对于WHERE子句中的每个名称,然后进行评估以提供正确的求和结果值.但是,这会因以下错误而失败:

函数和(字符变化)不存在

因为值有文字/字符.如何将该字符值转换为要正确计算的未加引号的字符串?

这个SQL有效.但是,当然,每个都给出相同的和值field_name,因为它q001001在这里是硬编码的.

select l.field_name, (select sum(q001001) from stats)
from stats_field_names_lookup as l
where l.field_name in ('Q001001', 'Q001002', 'Q001005');
Run Code Online (Sandbox Code Playgroud)

所以,我认为这个想法在理论上是合理的.只需要帮助弄清楚如何将该字符/字符串理解为field_name.有人有主意吗?

小智 0

实际上我不知道如何动态指定列名,但我建议这样做。

SELECT 'q001001' as FieldName, sum(q001001) as SUM FROM stats
UNION SELECT 'q001002' as FieldName, sum(q001002) as SUM FROM stats
UNION SELECT 'q001003' as FieldName, sum(q001003) as SUM FROM stats;
Run Code Online (Sandbox Code Playgroud)

这很简单,并且可以解决您原来的问题。