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中。