根据公共列值将定义数量的行转换为列
Pivoting a defined number of rows into columns according to a common column value
我在 SQL 服务器中的 table 中有如下一组数据:
Table Name: Metadata
IdMetadata IdMetadataKey Value IdBatch
1 3 50550000 105
2 2 ABC 105
3 5 Buks 105
4 1 Bruwer 105
5 4 AB1234567/4 105
6 6 Annuity Tax Directive 105
7 3 50594644 105
8 2 ABC 105
9 5 Jami 105
10 1 Leigh 105
11 4 9401213056080 105
12 6 Redemption 105
13 3 50550026 106
14 2 ABC 106
15 5 John 106
16 1 Smith 106
17 4 6812305023089 106
18 6 Tax Free Transfer Out 106
IdMetadataKey 中的列值是指向以下主键的外键 table
Table Name: MetadataKey
IdMetadataKey Description
1 LAST_NAME
2 COMPANY
3 INVESTOR_ID
4 IDENTIFICATION_NUMBER
5 FIRST_NAME
6 WORK_DESCRIPTION
我想使用上面提到的第一个 table 完成以下操作:
Investor_Id First_Name Last_Name ID_Number Work_Description Company IdBatch
50550000 Buks Bruwer AB1234567/4 Annuity Tax Directive ABC 105
50594644 Jami Leigh 555254 Redemption ABC 105
50550026 John Smith 9958586 Tax Free Transfer Out ABC 106
上面结果的解释是这样的:
取IdBatch 105,找出所有投资者及其相关
该批次的信息。因此批次 105
的 2 条记录
IdBatch 106也是一样。不过这里只有一条记录(investor)
找到
我曾尝试在 SQL 中使用 Pivot
命令来实现该结果,但无法正常工作。任何人都可以建议一种方法来获得所需的结果。
旁注:table 元数据中的一个批次总是有 6 (* n) 行。
一种方法是使用条件聚合将行“转换”为列。你知道你总是有相同的列,所以你可以简单地使用 case
到 select 每列的值。
请注意,您的示例输出 (ID_Number) 与您的示例数据不完全匹配,假设这只是一个示例数据准备疏忽。
您还需要一个额外的列来将 Investor_Id 分组在一起。
select
max(case idMetadataKey when 3 then value end) Investor_Id,
max(case idMetadataKey when 5 then value end) First_Name,
max(case idMetadataKey when 1 then value end) Last_Name,
max(case idMetadataKey when 4 then value end) Id_Number,
max(case idMetadataKey when 6 then value end) Work_Description,
max(case idMetadataKey when 2 then value end) Company,
IDBatch
from (
select *, Row_Number() over(partition by idbatch, IdMetadataKey order by IdMetadata) grp
from Metadatad
)m
group by IDBatch, grp
order by IDBatch, grp
看到这个DBFiddle
您可以在 sql 服务器中使用静态枢轴轻松完成此操作。在我看来,加入两个 table 以获得数据透视表 table 的列 header 将是一种更好的方法,而不是在查询中硬编码提及它们。
架构和插入语句:
create table metadata(IdMetadata int, IdMetadataKey int, Value varchar(50), IdBatch int);
insert into metadata values(1, 3 ,'50550000', 105);
insert into metadata values(2, 2 ,'ABC', 105);
insert into metadata values(3, 5 ,'Buks', 105);
insert into metadata values(4, 1 ,'Bruwer', 105);
insert into metadata values(5, 4 ,'AB1234567/4', 105);
insert into metadata values(6, 6 ,'Annuity Tax Directive', 105);
insert into metadata values(7, 3 ,'50594644', 105);
insert into metadata values(8, 2 ,'ABC', 105);
insert into metadata values(9, 5 ,'Jami', 105);
insert into metadata values(10, 1 ,'Leigh', 105);
insert into metadata values(11, 4 ,'9401213056080', 105);
insert into metadata values(12, 6 ,'Redemption', 105);
insert into metadata values(13, 3 ,'50550026', 106);
insert into metadata values(14, 2 ,'ABC', 106);
insert into metadata values(15, 5 ,'John', 106);
insert into metadata values(16, 1 ,'Smith', 106);
insert into metadata values(17, 4 ,'6812305023089', 106);
insert into metadata values(18, 6 ,'Tax Free Transfer Out', 106);
create table MetadataKey(IdMetadataKey int, Description varchar(50));
insert into MetadataKey values(1, 'LAST_NAME');
insert into MetadataKey values(2, 'COMPANY');
insert into MetadataKey values(3, 'INVESTOR_ID');
insert into MetadataKey values(4, 'IDENTIFICATION_NUMBER');
insert into MetadataKey values(5, 'FIRST_NAME');
insert into MetadataKey values(6, 'WORK_DESCRIPTION');
查询:
select max(Investor_Id)Investor_Id, max(First_Name)First_Name, max(Last_Name)Last_Name, max(IDENTIFICATION_NUMBER), max(Work_Description)Work_Description, max(Company)Company, max(IdBatch)IdBatch
from
(
select md.*, mdk.Description,row_number()over(partition by idbatch,md.idmetadatakey order by idmetadata)rnk from metadata md inner join metadatakey mdk on md.idMetadataKey=mdk.idMetadataKey
) As SourceTable
Pivot
(
max(value) for Description in (Investor_Id, First_Name, Last_Name, IDENTIFICATION_NUMBER, Work_Description, Company)
) as P
Group by IdBatch,rnk
order by idbatch,investor_id
输出:
Investor_Id
First_Name
Last_Name
(No column name)
Work_Description
Company
IdBatch
50550000
Buks
Bruwer
AB1234567/4
Annuity Tax Directive
ABC
105
50594644
Jami
Leigh
9401213056080
Redemption
ABC
105
50550026
John
Smith
6812305023089
Tax Free Transfer Out
ABC
106
dbhere
我在 SQL 服务器中的 table 中有如下一组数据:
Table Name: Metadata
IdMetadata IdMetadataKey Value IdBatch
1 3 50550000 105
2 2 ABC 105
3 5 Buks 105
4 1 Bruwer 105
5 4 AB1234567/4 105
6 6 Annuity Tax Directive 105
7 3 50594644 105
8 2 ABC 105
9 5 Jami 105
10 1 Leigh 105
11 4 9401213056080 105
12 6 Redemption 105
13 3 50550026 106
14 2 ABC 106
15 5 John 106
16 1 Smith 106
17 4 6812305023089 106
18 6 Tax Free Transfer Out 106
IdMetadataKey 中的列值是指向以下主键的外键 table
Table Name: MetadataKey
IdMetadataKey Description
1 LAST_NAME
2 COMPANY
3 INVESTOR_ID
4 IDENTIFICATION_NUMBER
5 FIRST_NAME
6 WORK_DESCRIPTION
我想使用上面提到的第一个 table 完成以下操作:
Investor_Id First_Name Last_Name ID_Number Work_Description Company IdBatch
50550000 Buks Bruwer AB1234567/4 Annuity Tax Directive ABC 105
50594644 Jami Leigh 555254 Redemption ABC 105
50550026 John Smith 9958586 Tax Free Transfer Out ABC 106
上面结果的解释是这样的:
取IdBatch 105,找出所有投资者及其相关 该批次的信息。因此批次 105
的 2 条记录IdBatch 106也是一样。不过这里只有一条记录(investor) 找到
我曾尝试在 SQL 中使用 Pivot
命令来实现该结果,但无法正常工作。任何人都可以建议一种方法来获得所需的结果。
旁注:table 元数据中的一个批次总是有 6 (* n) 行。
一种方法是使用条件聚合将行“转换”为列。你知道你总是有相同的列,所以你可以简单地使用 case
到 select 每列的值。
请注意,您的示例输出 (ID_Number) 与您的示例数据不完全匹配,假设这只是一个示例数据准备疏忽。
您还需要一个额外的列来将 Investor_Id 分组在一起。
select
max(case idMetadataKey when 3 then value end) Investor_Id,
max(case idMetadataKey when 5 then value end) First_Name,
max(case idMetadataKey when 1 then value end) Last_Name,
max(case idMetadataKey when 4 then value end) Id_Number,
max(case idMetadataKey when 6 then value end) Work_Description,
max(case idMetadataKey when 2 then value end) Company,
IDBatch
from (
select *, Row_Number() over(partition by idbatch, IdMetadataKey order by IdMetadata) grp
from Metadatad
)m
group by IDBatch, grp
order by IDBatch, grp
看到这个DBFiddle
您可以在 sql 服务器中使用静态枢轴轻松完成此操作。在我看来,加入两个 table 以获得数据透视表 table 的列 header 将是一种更好的方法,而不是在查询中硬编码提及它们。
架构和插入语句:
create table metadata(IdMetadata int, IdMetadataKey int, Value varchar(50), IdBatch int);
insert into metadata values(1, 3 ,'50550000', 105);
insert into metadata values(2, 2 ,'ABC', 105);
insert into metadata values(3, 5 ,'Buks', 105);
insert into metadata values(4, 1 ,'Bruwer', 105);
insert into metadata values(5, 4 ,'AB1234567/4', 105);
insert into metadata values(6, 6 ,'Annuity Tax Directive', 105);
insert into metadata values(7, 3 ,'50594644', 105);
insert into metadata values(8, 2 ,'ABC', 105);
insert into metadata values(9, 5 ,'Jami', 105);
insert into metadata values(10, 1 ,'Leigh', 105);
insert into metadata values(11, 4 ,'9401213056080', 105);
insert into metadata values(12, 6 ,'Redemption', 105);
insert into metadata values(13, 3 ,'50550026', 106);
insert into metadata values(14, 2 ,'ABC', 106);
insert into metadata values(15, 5 ,'John', 106);
insert into metadata values(16, 1 ,'Smith', 106);
insert into metadata values(17, 4 ,'6812305023089', 106);
insert into metadata values(18, 6 ,'Tax Free Transfer Out', 106);
create table MetadataKey(IdMetadataKey int, Description varchar(50));
insert into MetadataKey values(1, 'LAST_NAME');
insert into MetadataKey values(2, 'COMPANY');
insert into MetadataKey values(3, 'INVESTOR_ID');
insert into MetadataKey values(4, 'IDENTIFICATION_NUMBER');
insert into MetadataKey values(5, 'FIRST_NAME');
insert into MetadataKey values(6, 'WORK_DESCRIPTION');
查询:
select max(Investor_Id)Investor_Id, max(First_Name)First_Name, max(Last_Name)Last_Name, max(IDENTIFICATION_NUMBER), max(Work_Description)Work_Description, max(Company)Company, max(IdBatch)IdBatch
from
(
select md.*, mdk.Description,row_number()over(partition by idbatch,md.idmetadatakey order by idmetadata)rnk from metadata md inner join metadatakey mdk on md.idMetadataKey=mdk.idMetadataKey
) As SourceTable
Pivot
(
max(value) for Description in (Investor_Id, First_Name, Last_Name, IDENTIFICATION_NUMBER, Work_Description, Company)
) as P
Group by IdBatch,rnk
order by idbatch,investor_id
输出:
Investor_Id | First_Name | Last_Name | (No column name) | Work_Description | Company | IdBatch |
---|---|---|---|---|---|---|
50550000 | Buks | Bruwer | AB1234567/4 | Annuity Tax Directive | ABC | 105 |
50594644 | Jami | Leigh | 9401213056080 | Redemption | ABC | 105 |
50550026 | John | Smith | 6812305023089 | Tax Free Transfer Out | ABC | 106 |
db