我有以下格式的三个表:
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”,则out应该有一个新的TaxD,其百分比为0.00。
我知道在SQL中使用Pivot,我们可以将行值作为列名称,我在下面尝试查询
select *
from
(
select TaxTypeId,Code from Table_1 ) as p
pivot
(
max(Code)
for Code in ( [TaxA],[TaxB],[TaxC])
)as pvt
但它并不接近我的需要。
答案 0 :(得分:0)
您需要在数据透视
中使用max(TaxPercentage)
代替max(code)
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
如果代码中的值未修复,则需要使用动态数据透视
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 ( '+@pivot_list+')
)as pvt'
--print @sql
exec(@sql)