根据公共列值将定义数量的行转换为列

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

上面结果的解释是这样的:

  1. 取IdBatch 105,找出所有投资者及其相关 该批次的信息。因此批次 105

    的 2 条记录
  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