在没有聚合或列完全匹配的t-sql中进行透视

时间:2014-01-28 06:09:50

标签: sql sql-server pivot

我已经看到了一些答案,但似乎没有一个答案

我有一个大型数据库,其中许多表基本上彼此相同 - 但是,在过去的某些时候,新列已添加/重命名/删除。

我正在尝试使用INFORMATION_SCHEMA.COLUMNS获取每个目标表的列列表,但是采用数据透视表格式 - 因此表名称位于顶部,顺序位置为行。

使用这些表格

CREATE TABLE tbl1 (
  Id int
, Code int
, GroupName varchar(25)
, Amount money
, OutstandingAmount money
, DataDate date
)
ON [PRIMARY]

CREATE TABLE tbl2 (
      Id int
    , Code int
    , CompanyName varchar(25)
    , CompanyRegistrationDate date
    , Amount money
    , OutstandingAmount money
    , DataDate date
)
ON [PRIMARY]

CREATE TABLE tbl3 (
      Id int
    , Code int
    , CustomerId varchar(10)
    , CustomerName varchar(25)
    , Amount money
    , OutstandingAmount money
    , DataDate date
)
ON [PRIMARY]

然后以下查询获取数据,我可以在Excel中c& p排列列。

select
    c.ORDINAL_POSITION
    , c.TABLE_NAME
    , c.COLUMN_NAME
from INFORMATION_SCHEMA.COLUMNS c
WHERE TABLE_NAME LIKE 'tbl%'


ORDINAL_POSITION    TABLE_NAME  COLUMN_NAME
1   tbl1    Id
2   tbl1    Code
3   tbl1    GroupName
4   tbl1    Amount
5   tbl1    OutstandingAmount
6   tbl1    DataDate
1   tbl2    Id
2   tbl2    Code
3   tbl2    CompanyName
4   tbl2    CompanyRegistrationDate
5   tbl2    Amount
6   tbl2    OutstandingAmount
7   tbl2    DataDate
1   tbl3    Id
2   tbl3    Code
3   tbl3    CustomerId
4   tbl3    CustomerName
5   tbl3    Amount
6   tbl3    OutstandingAmount
7   tbl3    DataDate

然而,实际上有100个表(系统创建),所以c& p并不是一个明智的选择。

我的问题还在于列数不一致。

我尝试了一个支点,但无法解决什么问题!我试图实现这个......

ORDINAL_POSITION    tbl1                tbl2                        tbl3
    1               Id                  Id                          Id
    2               Code                Code                        Code
    3               GroupName           CompanyName                 CustomerId
    4               Amount              CompanyRegistrationDate     CustomerName
    5               OutstandingAmount   Amount                      Amount
    6               DataDate            OustandingAmount            OustandingAmount
    7               NULL                DataDate                    DataDate

1 个答案:

答案 0 :(得分:0)

使用也可以使用目录视图 sys.tablessys.columns代替INFORMATION_SCHEMA.COLUMNS

试试这个: -

    DECLARE @cols AS NVARCHAR(MAX);
    DECLARE @query AS NVARCHAR(MAX);

  select @cols = STUFF((SELECT distinct  ',' +
                    QUOTENAME(t.name) 
                  FROM sys.tables t 
                  inner join sys.columns c 
                  on c.object_id=t.object_id 
                  where t.name like 'tb%'
                  FOR XML PATH(''), TYPE
                 ).value('.', 'NVARCHAR(MAX)') 
                    , 1, 1, '');
 --Select @cols
 SELECT @query =
               'SELECT *
                FROM
                ( 
                select t.name as TableName,
                      c.name ColumnName,
                      row_number() over (PARTITION BY T.OBJECT_id order by T.NAME) as ID
                from sys.tables t 
                inner join sys.columns c 
                on c.object_id=t.object_id 
                    where t.name like ''tb%''
                ) AS t
                PIVOT 
               (
                MAX(ColumnName) 
                FOR TableName IN( ' + @cols + ' )' +
               ' ) AS p ; ';
      execute(@query);