gpt4 book ai didi

sql - 如何将行值显示为列名?

转载 作者:行者123 更新时间:2023-12-02 04:34:28 25 4
gpt4 key购买 nike

我有以下格式的三个表格:

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

但它离我需要的还差得很远。

最佳答案

您需要在 pivot 中使用 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)

关于sql - 如何将行值显示为列名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44931441/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com