SQL 查询将列转换为行

Posted

技术标签:

【中文标题】SQL 查询将列转换为行【英文标题】:SQL Query Convert columns to rows 【发布时间】:2020-09-02 14:00:18 【问题描述】:
select sum(cases) as [Total cases], sum(deaths) as [Total deaths] 
FROM [myschema].[metrics]

我们可以通过pivot/unpivot函数得到吗?

【问题讨论】:

【参考方案1】:

您也可以使用 UNPIVOT 来获得所需的结果:

   SELECT
    *
FROM
    (
        SELECT
            SUM(cases)      AS total_cases,
            SUM(deaths)     AS total_deaths
        FROM
            myschema.metrics
    ) UNPIVOT ( value
        FOR category
    IN ( total_cases,
         total_deaths ) );
     

上面的输出将是:

Category                Value
Total_cases             1234
Total_deaths            123

【讨论】:

【参考方案2】:

使用union all:

select 'total cases' info, sum(cases) cnt from metrics
union all select 'total deaths', sum(deaths) from metrics

或者,如果您的数据库支持横向连接:

select x.info, sum(x.cnt) cnt
from metrics m
cross join lateral (values ('total cases', m.cases), ('total deaths', m.deaths)) as x(info, cnt)
group by x.info

【讨论】:

为什么这篇文章在没有响应指南的情况下得到了答案?【参考方案3】:

最简单的通用方式是union all

select 'Total Cases'  as which, sum(cases) 
from [myschema].[metrics]
union all
select 'Total Deaths' as which, sum(deaths)
from [myschema].[metrics];

方括号看起来像 SQL Server。在这种情况下,我建议使用横向连接:

select v.*
from (select sum(cases) as TotalCases, sum(deaths) as TotalDeaths 
      from [myschema].[metrics]
     ) m cross apply
     (values ('TotalCases', TotalCases), ('TotalDeaths', TotalDeaths)
     ) v(which, cnt);

这只会读取一次表格。如果该表确实是一个更复杂的查询(例如视图或 CTE),则性能提升可能非常可观。

【讨论】:

为什么这篇文章在没有回应指南的情况下得到了答案? @SandraGuilepZouaouiZandeh。 . .回答的人似乎很清楚这个问题。

以上是关于SQL 查询将列转换为行的主要内容,如果未能解决你的问题,请参考以下文章

SQL:在 Chartio 中动态地将列转换为行

SQL 将列转换为行

sql 将列数据转换为行

SQL Server:将列转换为行

需要 PL/SQL 存储过程将列转换为行

使用pivot SQL将列转换为行