【发布时间】:2021-12-23 04:28:53
【问题描述】:
我在使用 Dapper 创建的 .Net 核心应用程序中有一个 SQL Server 临时表。然后我对此进行旋转,动态生成一个 DataTable,然后我用它为用户导出到 Excel。
我要添加的是小计行,但无法解决。这是我的代码的简单演示表示以及我希望实现的目标:
IF OBJECT_ID('tempdb..#t2') IS NOT NULL
DROP TABLE #t2
create table #t2 (
Client varchar(50),
TradeId varchar(50),
BusDate datetime,
ExpiryDate datetime,
Amount int
)
insert into #t2 values ('clientA', 'A0124', '20211110', '20211113', -400)
insert into #t2 values ('clientA', 'A0124', '20211111', '20211113', -400)
insert into #t2 values ('clientA', 'A0124', '20211112', '20211113', -400)
insert into #t2 values ('clientA', 'A0124', '20211113', '20211113', -400)
insert into #t2 values ('clientA', 'A0125', '20211110', '20211113', 250)
insert into #t2 values ('clientA', 'A0125', '20211111', '20211113', 250)
insert into #t2 values ('clientA', 'A0125', '20211112', '20211113', 250)
insert into #t2 values ('clientA', 'A0125', '20211113', '20211113', 250)
insert into #t2 values ('clientB', 'B0125', '20211110', '20211112', 100)
insert into #t2 values ('clientB', 'B0125', '20211111', '20211112', 100)
insert into #t2 values ('clientB', 'B0125', '20211112', '20211112', 100)
insert into #t2 values ('clientC', 'C0125', '20211110', '20211111', -500)
insert into #t2 values ('clientC', 'C0125', '20211111', '20211111', -500)
结果:
下一阶段展示了我向用户展示数据的关键:
-- pivot to create dynamic datatable for further exporting to Excel
DECLARE @cols2 AS NVARCHAR(MAX),
@query2 AS NVARCHAR(MAX)
select @cols2 = STUFF((SELECT ',' + QUOTENAME(CobDate)
from #t2
group by CobDate
order by CobDate asc
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query2 = N'SELECT CPartyName, SourceSystemTradeID, ' + @cols2 + N' from
(
select CpartyName, SourceSystemTradeID, CobDate, TradeMaturityDate, NotionalFX
from #t2
) x
pivot
(
max(NotionalFX)
for CobDate in (' + @cols2 + N')
) p '
exec sp_executesql @query2;
结果:
所以我试图在每个客户的行下插入一个小计行,例如在这个演示中,这一行将在两个 clientA 行下方:
我已尝试将此逻辑添加到 sql 中的数据透视查询中,还尝试使用以下不正确的 C# 方法修改 DataTable,但没有解决:
private void InsertSubTotals(ref DataTable dt)
{
DataRow totalsRow = dt.NewRow();
foreach (DataColumn col in dt.Columns)
{
if (col.ColumnName != "Client" && col.ColumnName != "TradeId")
{
var colTotal = 0;
foreach (DataRow row in col.Table.Rows)
{
var t = int.Parse(row[col].ToString());
colTotal += t;
}
totalsRow[col.ColumnName] = colTotal;
}
}
dt.Rows.Add(totalsRow);
}
非常感谢任何帮助。
【问题讨论】:
-
你的
InsertSubTotals方法有什么问题? -
我冒昧地建议,在 Excel 中旋转它可能比在 SQL Server 中更容易,因为 SQL Server 喜欢修复它的列
标签: c# sql-server .net-core datatable