回答

收藏

包含超过20列表的每列求和不写总和

技术问答 技术问答 235 人阅读 | 0 人回复 | 2023-09-14

因此,我需要在我正在使用的表中获得20多列的总和。我真的不想写每列的总和,但我不确定这是否可能。有没有办法让它动态地写入表中的所有列?
! R8 d  r/ U- H9 G1 o: C5 Vselect isnull(osname,'Total'),COUNT(*),SUM(col1),SUM(col2),SUM(col3)...sum(col27)from usagegroup by osnamewith rollup                " W  T; j: g4 U8 r1 Z/ B2 h) O
    解决方案:                                                               
9 m, u/ M& p- y                                                                首先,如果可以自动化,请这样做。输入20或100列绝对无聊。
4 r  C% L" }1 [( @0 U我下面的解决方案使用表变量函数获取编号列表。这可以重用。' w7 O4 u6 }. X$ o+ n" ]
其次,我用这个函数和你的逻辑来创建一些动态的T-SQL。WITH ROLLUP语法不符合ISO。在2008 R二中已替换。1 e. J, ^' V$ C- A* m
http://technet.microsoft.com/zh-
# K4 z2 C) g* j7 E/ a, R& ~6 HCN/library/ms177673.aspx$ P9 ]* T5 m) m6 ]4 m$ {+ q
让我们谈谈生意。我喜欢创建一个快速测试表,以确保我的语法正确。我甚至会犯错误。. F2 V' Z8 [9 J/ `8 S" V
---- Setup test data---- Just playing arounduse tempdb;go-- Drop test tableif object_id ('usage') > 0 drop table usagego-- Create test tablecreate table usage( osname varchar(16), col1 int, col2 int, col3 int, col4 int, col5 int);go-- Test datainsert into usage values('UNIX一、二、三、四、五)UNIX二、四、六、八、十,WIN7一、二、三、四、五)WIN7二、四、六、八、十,WIN8',5,10,15,20,25);go-- Show the dataselect * from usage;go接下来,让我们创建一个内联表值函数。它们相对较快。
9 I; J# g" O: }6 `* ^9 i7 Nhttp://blog.waynesheffield.com/wayne/archive/2012/02/comparing-inline-and-6 d/ O' K: C& \2 ?! \7 J
multistatement-table-valued-# Y- w8 h" `' G* V, e1 w
functions/; s# Z  O! `3 U0 |: P) j
---- Create helper function---- Remove ITVFif object_id('get_columns') > 0drop function get_columnsgo-- Create ITVFcreate function get_columns (@table_name sysname)returns tableasreturn (  select top 100 column_id,name from sys.columns where object_id in  (  select object_id from sys.tables t where t.name = @table_name )  order by column_id)go-- Get the columnsselect * from get_columns('usage');go现在,将它们放在一起解决您的问题。注意,您需要保留被遗漏的列名。我还改用了符合ISO的语法。
. ^3 J9 K+ R  F- y: W---- Solve the problem---- Dynamic SQLdeclare @var_tsql nvarchar(max) = 'SELECT ';select   @var_tsql  =     case       when column_id  1 then 'SUM('   name   ) as s_'   name    else 'ISNULL('   name  Total'') as s_name,'    end from get_columns('usage');select @var_tsql  = 'COUNT(*) as s_count FROM usage GROUP BY ROLLUP(osname); '--print @var_tsqlEXEC sp_executesql @var_tsql;print语句用于调试任何语法错误。切割并粘贴在另一个窗口以检查语法。你学得越多,就越动态SQL就越容易。: N4 I* v% c* ^  t
上面的动态TSQL能正常工作。这是你的输出。
( F6 |& u) D' v* }3 [

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则