如何将行值显示为列名称?

问题描述:

我具有在下格式三个表:如何将行值显示为列名称?

Table_1 (Tax Types) 

TaxTypeID Code  Description LocationID 
1   TaxA   DescA   1 
2   TaxB   DescB   1 
3   TaxC   DescB   1 

Table_2 (Tax Plans) 

PlanID Name Description LocationID 
1  Plan1  Plan1   1 

Table_3 (Cross Reference) 

TaxTypeID PlanID TaxPercentage 
    1   1   5.00 
    2   1   7.00 

所以我需要编写一个查询时plan_id的数据类型通过匹配表1和2 LocationID过去了,还用于输出下面的结果:

PlanID Name TaxA TaxB TaxC 
    1 Plan1 5.00 7.00 0.00 

如果table_3在table_1和table_2之间没有交叉引用,百分比应该显示为0.00。主要是我需要在Table_1中显示行(税类型)作为列名在我的输出中,这应该是动态的,基于Table_1中的行(税类型)。因此,如果添加新的税务类型行“TaxD”,则应该有一个新的TaxD列,其中0.00为百分比。

我知道在SQL使用透视,我们可以得到行值的列名,我试图下面的查询

select * 
from 
(
select TaxTypeId,Code from Table_1 ) as p 
pivot 
(
max(Code) 
for Code in ([TaxA],[TaxB],[TaxC]) 
)as pvt 

但它不是接近我所需要的。

+0

你错过了一些加入到表2和Table3 – scsimon

+0

在我的查询中,我在数据透视部分有硬编码的列名,但实际上新用户行会被用户添加,所以我不知道如何在添加之前在查询中自动设置“用于(行集合)中的代码”连接。 – user2502961

+0

无论如何,您仍然缺少一些连接... – scsimon

你需要支点

select * from 
(
SELECT c.planid,c.NAME,taxpercentage,a.Code 
FROM table_1 a 
     JOIN table_3 b 
     ON a.taxtypeid = b.taxtypeid 
     JOIN table_2 c 
     ON c.planid = b.planid 
) as p 
pivot 
(
max(TaxPercentage) 
for Code in ([TaxA],[TaxB],[TaxC]) 
)as pvt 

使用max(TaxPercentage),而不是max(code)如果代码中的值不是那么固定,你需要使用动态旋转

declare @sql varchar(8000),@col_list varchar(8000),@pivot_list varchar(8000) 

set @col_list =stuff((select distinct ',Coalesce('+ quotename(Code) + ',0) as '+ quotename(Code) from Table_1 for xml path('')),1,1,'') 

set @pivot_list =stuff((select distinct ','+quotename(Code) from Table_1 for xml path('')),1,1,'') 

set @sql = 'select * from 
(
SELECT c.planid,c.NAME,taxpercentage,a.Code 
FROM table_1 a 
     JOIN table_3 b 
     ON a.taxtypeid = b.taxtypeid 
     JOIN table_2 c 
     ON c.planid = b.planid 
) as p 
pivot 
(
max(TaxPercentage) 
for Code in ('[email protected]_list+') 
)as pvt' 
--print @sql 
exec(@sql) 
+0

您的查询有效,谢谢。内部查询中的快速问题我正在检查taxpercentage值是否为null并将其设置为0,但如果交叉引用不在Table_3中退出,仍然输出返回null。由于列名是动态的,因此我无法在外部查询中检查它。如果空值为零,是否有任何选择将百分比返回为0? – user2502961

+0

@ user2502961 - Updated ..check now –