【发布时间】:2017-10-22 23:28:12
【问题描述】:
我在 SQL Server 中有一个表,现在考虑的临时表如下:
IF OBJECT_ID('tempdb..#Period') IS NOT NULL DROP TABLE #Period
IF OBJECT_ID('tempdb..#Account') IS NOT NULL DROP TABLE #account
IF OBJECT_ID('tempdb..#BudgetDetail') IS NOT NULL DROP TABLE #BudgetDetail
create table #Period([PeriodId] int,[PeriodName] varchar(50),CompanyID int)
insert into #Period values(1,'P1',100171)
insert into #Period values(2,'P2',100171)
insert into #Period values(3,'P3',100171)
select * from #Period
create table #account([AccountId] int,CompanyID int)
insert into #account values(1,100171)
insert into #account values(2,100171)
insert into #account values(3,100171)
select * from #account
create table #BudgetDetail([PeriodId] int,[AccountId] int,[Amount] money,CompanyID int)
insert into #BudgetDetail values(1,1,101,100171)
insert into #BudgetDetail values(1,2,100,100171)
insert into #BudgetDetail values(1,3,160,100171)
insert into #BudgetDetail values(2,1,110,100171)
insert into #BudgetDetail values(2,2,170,100171)
insert into #BudgetDetail values(2,3,0,100171)
insert into #BudgetDetail values(3,1,120,100171)
insert into #BudgetDetail values(3,2,180,100171)
insert into #BudgetDetail values(3,3,0,100171)
select * from #BudgetDetail
Below is my query :
DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX), @CompanyID int = 100171
SELECT
@cols = STUFF((SELECT ',' + QUOTENAME([PeriodName] + ';' +
CONVERT(VARCHAR,[PeriodId]))
FROM
#Period
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)'),1,1,'')
SET @query = 'SELECT * FROM
(SELECT bd.AccountId, PeriodName, Amount
FROM
#Account acc LEFT JOIN
#Period pr ON acc.CompanyID = pr.CompanyID LEFT JOIN
#BudgetDetail bd ON acc.AccountId = bd.AccountID AND acc.CompanyID =
bd.CompanyID AND
pr.PeriodId = bd.PeriodId AND
pr.CompanyID = bd.CompanyID
) x
PIVOT
(
SUM(Amount)
FOR PeriodName IN (' + @cols + ')
) p '
print @query
EXECUTE(@query);
当我在上面运行查询时得到以下输出: 这是我的输出
<table style="width: 100%;" border="1">
<tbody>
<tr style="height: 21px;">
<td style="height: 21px; width: 19%;"> AccountId</td>
<td style="height: 21px; width: 25.5771%;"> P1;1</td>
<td style="height: 21px; width: 34.4229%;"> P2;2</td>
<td style="height: 21px; width: 19%;"> P3;3</td>
</tr>
<tr style="height: 21px;">
<td style="height: 21px; width: 19%;"> 1</td>
<td style="height: 21px; width: 25.5771%;"> NULL</td>
<td style="height: 21px; width: 34.4229%;"> NULL</td>
<td style="height: 21px; width: 19%;"> NULL</td>
</tr>
<tr style="height: 21px;">
<td style="height: 21px; width: 19%;"> 2</td>
<td style="height: 21px; width: 25.5771%;"> NULL</td>
<td style="height: 21px; width: 34.4229%;"> NULL</td>
<td style="height: 21px; width: 19%;"> NULL</td>
</tr>
<tr style="height: 21px;">
<td style="height: 21px; width: 19%;"> 3</td>
<td style="height: 21px; width: 25.5771%;"> NULL</td>
<td style="height: 21px; width: 34.4229%;"> NULL</td>
<td style="height: 21px; width: 19%;"> NULL</td>
</tr>
</tbody>
</table>
上面的输出是正确的,但我想要的是 Amount 列值而不是 NULL 值,如下所示:
我想要像 Fill NULL value 这样的输出,如下所示:
<table style="width: 100%;" border="1">
<tbody>
<tr style="height: 21px;">
<td style="height: 21px;"> AccountId</td>
<td style="height: 21px;"> P1;1</td>
<td style="height: 21px;"> P2;2</td>
<td style="height: 21px;"> P3;3</td>
</tr>
<tr style="height: 21px;">
<td style="height: 21px;"> 1</td>
<td style="height: 21px;"> 101</td>
<td style="height: 21px;"> 110</td>
<td style="height: 21px;"> 120</td>
</tr>
<tr style="height: 21px;">
<td style="height: 21px;"> 2</td>
<td style="height: 21px;"> 100</td>
<td style="height: 21px;"> 170</td>
<td style="height: 21px;"> 180</td>
</tr>
<tr style="height: 21px;">
<td style="height: 21px;"> 3</td>
<td style="height: 21px;"> 160</td>
<td style="height: 21px;"> 0</td>
<td style="height: 21px;"> 0</td>
</tr>
</tbody>
</table>
【问题讨论】:
-
[PeriodName] couln 在#Period Table 中不可用
-
@Srini131 感谢您的回复。让我纠正一下。
-
CompanyID 好像也不见了
-
现在可以查看了
-
现在检查您更新的脚本,以供将来参考,使用 dbfiddle 链接可以更轻松地解决这些类型的问题
标签: sql sql-server pivot