[英]Getting null value in the Grand Total column in the Pivot Table in sql
我有一个查询,该查询返回给我一个cloumn中的类别数,而其他列为动态列,它们给了我开始日期和结束日期之间的月份,并且此列向我返回了当月所售类别的数量。
我想在查询的行末添加总计
这是我的查询
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX),
@subtotal AS FLOAT,
@startdate as datetime,
@enddate as datetime
DECLARE @ColumnsRollup AS VARCHAR (MAX)
set @startdate = '1-Mar-2014'
set @enddate = '1-Aug-2014'
;with cte (StartDate, EndDate) as
(
select min(@startdate) StartDate, max(@enddate) EndDate
union all
select dateadd(mm, 1, StartDate), EndDate
from cte
where StartDate < EndDate
)
select StartDate
into #tempDates
from cte
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(convert(CHAR(10), StartDate, 120))
from #tempDates
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'') + ',[Total]'
SET @query = 'select ledger_name,
' + @cols + '
from
(
SELECT
CASE WHEN (GROUPING(ledger_name) = 1) THEN ''Grand Total''
ELSE ledger_name END AS ledger_name,
ISNULL(SUM(amount),0) Amount,
CASE WHEN (GROUPING(StartDate) = 1) THEN ''Total''
ELSE convert(CHAR(10), StartDate, 120) END StartDate
FROM #tempDates d
left join Rs_Ledger_Master AS LM on d.StartDate between '''+convert(varchar(10), @startdate, 120)+''' and '''+convert(varchar(10), @enddate, 120)+'''
LEFT OUTER JOIN RS_Payment_Master AS PM ON PM.ledger_code = LM.ledger_code and month(paid_date) = month(StartDate) and year(paid_date) = year(StartDate)
group by
ledger_name,StartDate WITH ROLLUP
) d
pivot
(
SUM(Amount)
for StartDate in (' + @cols + ')
) p
ORDER BY CASE WHEN ledger_name = ''Grand Total'' THEN 1 END'
execute sp_executesql @query;
drop table #tempDates
我认为您可以做的是,尝试在内部查询中使用ROLLUP选项,该查询实际上为SUM(Amount)返回附加行,您可以将其称为Total并将此列添加到列列表中。
这是我认为您需要做的更改
在栏列表末尾添加总栏
SET @cols= @cols + ',[Total]'
将汇总选项添加到内部查询中。 请注意,需要case语句才能将文本更改为该行的总计。
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX),
@subtotal AS FLOAT,
@startdate as datetime,
@enddate as datetime
DECLARE @ColumnsRollup AS VARCHAR (MAX)
set @startdate = '1-Mar-2014'
set @enddate = '1-Aug-2014'
;with cte (StartDate, EndDate) as
(
select min(@startdate) StartDate, max(@enddate) EndDate
union all
select dateadd(mm, 1, StartDate), EndDate
from cte
where StartDate < EndDate
)
select StartDate
into #tempDates
from cte
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(convert(CHAR(10), StartDate, 120))
from #tempDates
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'') + ',[Total]'
SET @query = 'select ledger_name,
' + @cols + '
from
(
SELECT
ledger_name,
ISNULL(SUM(amount),0) Amount,
CASE WHEN (GROUPING(StartDate) = 1) THEN ''Total''
ELSE convert(CHAR(10), StartDate, 120) END StartDate
FROM #tempDates d
left join Rs_Ledger_Master AS LM on d.StartDate between '''+convert(varchar(10), @startdate, 120)+''' and '''+convert(varchar(10), @enddate, 120)+'''
LEFT OUTER JOIN RS_Payment_Master AS PM ON PM.ledger_code = LM.ledger_code and month(paid_date) = month(StartDate) and year(paid_date) = year(StartDate)
group by
ledger_name,StartDate WITH ROLLUP
) d
pivot
(
SUM(Amount)
for StartDate in (' + @cols + ')
) p
WHERE ledger_name IS NOT NULL
UNION ALL
select ledger_name,
' + @cols + ' FROM
(SELECT ''Grand Total'' AS ledger_name,
ISNULL(SUM(amount),0) Amount,
CASE WHEN (GROUPING(StartDate) = 1) THEN ''Total''
ELSE convert(CHAR(10), StartDate, 120) END StartDate
FROM #tempDates d
left join Rs_Ledger_Master AS LM on d.StartDate between '''+convert(varchar(10), @startdate, 120)+''' and '''+convert(varchar(10), @enddate, 120)+'''
LEFT OUTER JOIN RS_Payment_Master AS PM ON PM.ledger_code = LM.ledger_code and month(paid_date) = month(StartDate) and year(paid_date) = year(StartDate)
group by StartDate WITH ROLLUP
) d
pivot
(
SUM(Amount)
for StartDate in (' + @cols + ')
) p
'
print @query
execute sp_executesql @query;
drop table #tempDates
您需要附加所有并集以获取最后的摘要行
您可以参考以下文章以使用ROLLUP http://technet.microsoft.com/zh-cn/library/ms189305(v=sql.90).aspx
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.