SQL查询将列转换为行

SQL查询将列转换为行,sql,sum,pivot,unpivot,Sql,Sum,Pivot,Unpivot,我们可以通过pivot/unpivot函数获取吗?使用联合所有人: select sum(cases) as [Total cases], sum(deaths) as [Total deaths] FROM [myschema].[metrics] select x.info, sum(x.cnt) cnt from metrics m cross join lateral (values ('total cases', m.cases), ('total deaths', m.death


我们可以通过pivot/unpivot函数获取吗?

使用
联合所有人

select sum(cases) as [Total cases], sum(deaths) as [Total deaths] 
FROM [myschema].[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
或者,如果数据库支持横向联接:

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

最简单的通用方法是
union all

select sum(cases) as [Total cases], sum(deaths) as [Total deaths] 
FROM [myschema].[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
方括号看起来像SQL Server。在这种情况下,我建议采用横向连接:

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

这只会读取表格一次。如果表确实是一个更复杂的查询(例如视图或CTE),那么性能会有很大的提高。

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

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);
上述数据的输出将为:

   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 ) );
     

为什么这篇文章在不响应指南的情况下得到答案?为什么这篇文章在不响应指南的情况下得到答案?@SandraGuilepZouaouiZandeh。这个问题对回答的人来说似乎很清楚。