如何动态在表中获取多个行的总和
我正在尝试从数据库中多个表的特定数据类型(货币)的列中获取总和。目前,我能够从特定表中获取列列表,但我无法从这些列中获得总和。
这就是我现在拥有的结果,
use database 1
Select + Column_Name
From information_schema.columns
Where TABLE_NAME = 'claimant'
and data_type = 'money'
结果看起来像
table_name | column_name |
---|---|
table_1 | column_a |
table_1 | column_b |
table_1 column_1 | column_1 |
我想要的
table_name | column_name column_name | total_name |
---|---|---|
table_sum table_a | column_a | 66.20 |
table_1 | column_b | 300.50 |
table_1 column_c | column_c | 5389.42 |
for @squirrel for @squirrel for @squirrel在这里保持@squirrel在这里的代码我的截断问题。
{
declare @sql nvarchar(max);
select @sql = 'with cte as (' + char(13)
+ 'select' + char(13)
+ string_agg(char(9) + quotename(column_name) + ' = sum(' + quotename(COLUMN_NAME) + ')', ',' + char(13)) + char(13)
+ 'from ' + max(quotename(table_name)) + char(13)
+ ')' + char(13)
+ 'select a.table_name, a.column_name, a.total_sum ' + char(13)
+ 'from cte ' + char(13)
+ 'cross apply (' + char(13)
+ char(9) + 'values' + char(13)
+ string_agg(char(9) + '(''' + table_name + ''',''' + column_name + ''',' + quotename(COLUMN_NAME) + ')', ',' + char(13)) + char(13)
+ ') a (table_name, column_name, total_sum)'
from information_schema.columns AS A
INNER JOIN EDL01.STAGING.TABLE_DETAILS B
ON A.TABLE_NAME = B.DEST_TABLE_NAME
where A.table_name = B.DEST_TABLE_NAME
and data_type = 'money'
print @sql
exec sp_executesql @sql
}
创建表
CREATE TABLE [staging].[TABLE_DETAILS](
[SOURCE_TABLE_NAME] [varchar](100) NULL,
[DEST_TABLE_NAME] [varchar](100) NULL,
[TYPE] [varchar](10) NULL,
[PRIORITY] [int] NULL,
[SOURCE_TABLE_DATABASE] [varchar](50) NULL,
[SOURCE_TABLE_SCHEMA] [varchar](50) NULL,
[DEST_TABLE_DATABASE] [varchar](50) NULL,
[DEST_TABLE_SCHEMA] [varchar](50) NULL
) ON [PRIMARY]
GO
下面是下面的
select a.table_name, a.column_name, a.total_sum
from cte
cross apply (
values
('PAYMENT','BILLEDAMOUNT',[BILLEDAMOUNT]),
('PAYMENT','AMOUNT',[AMOUNT]),
('SIMS_PAYMENT','CHECKAMOUNT',[CHECKAMOUNT]),
('BILLREVIEWHEADER','JURISDICTIONAMOUNT1',[JURISDICTIONAMOUNT1]),
('BILLREVIEWHEADER','JURISDICTIONAMOUNT2',[JURISDICTIONAMOUNT2]),
('BILLREVIE
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您需要动态形成查询,然后使用
sp_executesql
或exec()
注意:
char(9)
是TAB,char(13)
是马车返回。这些被添加以格式化查询,以便当您打印
以进行验证时可以阅读。对于您的示例表,生成的动态查询正在
编辑
使用循环迭代每个表。基本上,它在表上对每个表执行查询,然后将结果插入临时表中,
请参见
对于没有String_agg()的早期SQL Server版本
You need to form the query dynamically and then execute it using
sp_executesql
orexec()
Note :
char(9)
is tab,char(13)
is carriage return. These are added to format the query so that it is readable when youprint
it out for verification.For your sample table, the generated dynamic query is
EDIT
using a loop to iterate each table. Basically it execute above query for each of the table and insert the result into a temp table
see db<>fiddle demo
for earlier SQL Server version without string_agg(), use
for xml path