如何将行值显示为列名?

时间:2017-07-05 16:21:52

标签: sql sql-server

我有以下格式的三个表:

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

但它并不接近我的需要。

1 个答案:

答案 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)