使用pivot转换行数据

时间:2014-07-24 12:29:39

标签: sql sql-server

我的表格式是

    TableName       columnName              IssueType       IssueDetails    
tblOrder_Inv    OrderI_mnySalesTax1     DefaultValue    MSSQL=NULL|MySql=0.0000
tblOrder_Inv    OrderI_mnySalesTax1     DataType        MSSQL=NULL|MySql=0.0000    
tblOrder_Inv    OrderI_dtmDateTime      IsNullable      MSSQL=NULL|MySql=0.0000
tblOrder_Inv    OrderI_dtmDateTime      DefaultValue    MSSQL=NULL|MySql=CURRENT_TIMESTAMP    
tblOrder_Inv    OrderI_mnyInvTotal      DefaultValue    MSSQL=NULL|MySql=0.0000

我需要这种格式

TableName       columnName              DefaultValue    IsNullable  DataType    
tblOrder_Inv    OrderI_mnySalesTax1     Yes             No          Yes    
tblOrder_Inv    OrderI_dtmDateTime      Yes             Yes         No    
tblOrder_Inv    OrderI_mnyInvTotal      Yes             No          NO

数据流是每个表有很多列,每列有不同的问题 (DefaultValue DataType IsNullable)。每个有一个问题的列都插入一行。

例如tableA => ColumnA =>有两个问题说IsNullable,DefaultValue 插入为

tableA  ColumnA IsNullable
tableA  ColumnA DefaultValue

两行。

我需要这就像dis

tableA ColumnA Isnullable DefaultValue  

同样..

如果相同的tableA具有任何issueType的ColumnB应该作为新行获取。

我试过Pivot

select * from ( select TableName,columnName, IssueType from #tmp) AS T pivot (MAX(columnName) For IssueType In (DefaultValue,DataType,IsNullable)) as T2

没有得到预期的结果。是否有可能通过枢轴实现这一目标?

请帮帮我..

更新:

除此之外,我可以在接受的答案的最终查询中连接IssueDetails列吗?

1 个答案:

答案 0 :(得分:3)

结果:

|    TABLENAME |          COLUMNNAME | DEFAULTVALUE | ISNULLABLE | DATATYPE |
|--------------|---------------------|--------------|------------|----------|
| tblOrder_Inv |  OrderI_dtmDateTime |          Yes |        Yes |       No |
| tblOrder_Inv |  OrderI_mnyInvTotal |          Yes |         No |       No |
| tblOrder_Inv | OrderI_mnySalesTax1 |          Yes |         No |      Yes |

制作人:

   SELECT
          TableName
        , columnName
        , MAX(CASE
                WHEN IssueType = 'DefaultValue' THEN 'Yes'
                ELSE 'No' END) as DefaultValue
        , MAX(CASE
                WHEN IssueType = 'IsNullable' THEN 'Yes'
                ELSE 'No' END) as IsNullable
        , MAX(CASE
                WHEN IssueType = 'DataType' THEN 'Yes'
                ELSE 'No' END) as DataType
    FROM table1
    GROUP BY
          TableName
        , columnName

在“pivot”成为SQL指令之前,使用像这样的case表达式称为pivoting,它们对于此目的仍然非常有用。

请参阅:http://sqlfiddle.com/#!3/b5de2/3