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)
这很简单,并且可以解决您原来的问题。
| 归档时间: |
|
| 查看次数: |
660 次 |
| 最近记录: |