Sql 使用pivot转换行数据

Sql 使用pivot转换行数据,sql,sql-server,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 t

我的表格格式是

    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数据类型可为空。包含一个问题的每列将作为一行插入

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

tableA  ColumnA IsNullable
tableA  ColumnA DefaultValue
两排

我需要这个像dis一样

tableA ColumnA Isnullable DefaultValue  
同样地

如果同一个表a的ColumnB中有任何issueType,则应将其作为新行获取

我试过旋转

选择*从tmp中选择TableName、columnName、IssueType作为T DefaultValue、DataType中IssueType的pivot MAXcolumnName可作为T2为空

没有得到想要的结果。是否有可能通过pivot实现这一点

请帮帮我

更新:

除此之外,我还可以在接受答案的最终查询中获得IssuedDetails列的浓缩吗?

结果:

|    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,它们在这方面仍然非常有用


请参阅:

+1在那里偷偷地使用MAX,尽管有点黑。只是不要本地化“是/否”字符串:非常感谢你,伙计。。这正是我们所期望的!!!!结果正是我需要的。查询将生成多行结果,但是如果一行说“是”,该列的MAX将返回“是”,因为字符串“是”大于字符串“否”。例如,在瑞典语中,Yes/No是Ja/Nej,如果查询是本地化的,则会破坏逻辑,因为“Nej”>“Ja”而不是相反。数据中的DefaultValue实际上只有一个可能值,或者它不存在。如果存在DefaultValue,则得到“是”,如果不存在,则得到“否”。MAX只是确保在“是”高于“否”的位置获得最高值。关键是,您必须在这些位置使用聚合函数,否则无法将每个表+字段的行数减少到一行。您可以返回1是,0否,然后使用I18N查找表将其转换为本地的“是/否”字符串,但我认为它不会添加任何被接受的答案。@GarethD是的。很想知道我在那个支点上犯了什么错误。。好的,让我搜索一下,只想知道:干杯!!您没有任何中带有YES/NO的列,因此您不能期望在透视的结果中出现这些列,相反,您需要为存在的行创建一个中带有YES的列,然后在该行不存在的地方(即结果为NULL)使用NO。在透视中,由于您在聚合中使用columnname,因此它不会将其包含在隐含的group by中。