通过组合 2 列以形成新列,将 SQL 服务器中的行转换为列
Convert rows to columns in SQL Server by combining 2 columns to form the new column
我正在尝试完成与 Efficiently convert rows to columns in sql server 相关的事情
不同之处在于我有 2 列需要形成新列。
所以我使用了前面提到的 SO post 中的这个例子,因为我有 1-N 列:https://data.stackexchange.com/Whosebug/query/497433
这是我目前拥有的:https://data.stackexchange.com/Whosebug/query/1307538
我只是不知道如何在第二个(已注释的)查询中组合 year/quarter。
最后我想:
Cols: 2022Q1 2022Q2 2022Q3 2022Q4 2022Q1
Vals: 123 456 345 234 789
如有任何帮助,我们将不胜感激!
您需要在旋转之前计算子查询中的 year/quarter 字符串。我认为你想要的逻辑是:
set @query =
n'select ' + @cols + n' from
(
select [count],
convert(nvarchar, [year]) + ''q'' + convert(nvarchar, [quarter]) yyyyqq
from #yourtable
) x pivot (
max([count])
for yyyyqq in (' + @cols + n')
) p';
exec sp_executesql @query;
如果您使用的是最新版本的 SQL 服务器,您可以使用 CONCAT 和 STRING_AGG 函数来 assemble 查询字符串,然后动态执行。数据来自您的 link.
数据
drop table if exists #yourtable;
go
create table #yourtable
([Id] int, [Year] int, [Quarter] int, [Count] int);
insert into #yourtable([Id], [Year], [Quarter], [Count]) values
(1, 2022, 1, 123),
(2, 2022, 2, 456),
(3, 2022, 3, 345),
(4, 2022, 4, 234),
(5, 2023, 1, 789);
查询
declare
@select nvarchar(max)=N'select',
@str1 nvarchar(max)=N' sum(case when [Year]=',
@str2 nvarchar(max)=N' and [Quarter]=',
@str3 nvarchar(max)=N' then [Count] else 0 end) as [',
@str4 nvarchar(max)=N']',
@from nvarchar(max)=N' from #yourtable;',
@sql nvarchar(max);
select @sql=concat(@select,
string_agg(concat(@str1, [Year], @str2, [Quarter], @str3,
[Year], N'Q',[Quarter], @str4), N','),
@from)
from #yourtable
exec sp_executesql @sql;
输出
2022Q1 2022Q2 2022Q3 2022Q4 2023Q1
123 456 345 234 789
我正在尝试完成与 Efficiently convert rows to columns in sql server 相关的事情 不同之处在于我有 2 列需要形成新列。
所以我使用了前面提到的 SO post 中的这个例子,因为我有 1-N 列:https://data.stackexchange.com/Whosebug/query/497433
这是我目前拥有的:https://data.stackexchange.com/Whosebug/query/1307538
我只是不知道如何在第二个(已注释的)查询中组合 year/quarter。
最后我想:
Cols: 2022Q1 2022Q2 2022Q3 2022Q4 2022Q1
Vals: 123 456 345 234 789
如有任何帮助,我们将不胜感激!
您需要在旋转之前计算子查询中的 year/quarter 字符串。我认为你想要的逻辑是:
set @query =
n'select ' + @cols + n' from
(
select [count],
convert(nvarchar, [year]) + ''q'' + convert(nvarchar, [quarter]) yyyyqq
from #yourtable
) x pivot (
max([count])
for yyyyqq in (' + @cols + n')
) p';
exec sp_executesql @query;
如果您使用的是最新版本的 SQL 服务器,您可以使用 CONCAT 和 STRING_AGG 函数来 assemble 查询字符串,然后动态执行。数据来自您的 link.
数据
drop table if exists #yourtable;
go
create table #yourtable
([Id] int, [Year] int, [Quarter] int, [Count] int);
insert into #yourtable([Id], [Year], [Quarter], [Count]) values
(1, 2022, 1, 123),
(2, 2022, 2, 456),
(3, 2022, 3, 345),
(4, 2022, 4, 234),
(5, 2023, 1, 789);
查询
declare
@select nvarchar(max)=N'select',
@str1 nvarchar(max)=N' sum(case when [Year]=',
@str2 nvarchar(max)=N' and [Quarter]=',
@str3 nvarchar(max)=N' then [Count] else 0 end) as [',
@str4 nvarchar(max)=N']',
@from nvarchar(max)=N' from #yourtable;',
@sql nvarchar(max);
select @sql=concat(@select,
string_agg(concat(@str1, [Year], @str2, [Quarter], @str3,
[Year], N'Q',[Quarter], @str4), N','),
@from)
from #yourtable
exec sp_executesql @sql;
输出
2022Q1 2022Q2 2022Q3 2022Q4 2023Q1
123 456 345 234 789