如何将行值显示为列名称?
我具有在下格式三个表:如何将行值显示为列名称?
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
但它不是接近我所需要的。
你需要支点
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)
您的查询有效,谢谢。内部查询中的快速问题我正在检查taxpercentage值是否为null并将其设置为0,但如果交叉引用不在Table_3中退出,仍然输出返回null。由于列名是动态的,因此我无法在外部查询中检查它。如果空值为零,是否有任何选择将百分比返回为0? – user2502961
@ user2502961 - Updated ..check now –
你错过了一些加入到表2和Table3 – scsimon
在我的查询中,我在数据透视部分有硬编码的列名,但实际上新用户行会被用户添加,所以我不知道如何在添加之前在查询中自动设置“用于(行集合)中的代码”连接。 – user2502961
无论如何,您仍然缺少一些连接... – scsimon