【发布时间】:2020-01-10 22:59:34
【问题描述】:
我有一张表,我需要根据列中的值来汇总列结果,所以我想像一个数据透视表。请参阅应用程序。下面的结构。这个想法是文档可能包含数百列,因此代码必须是动态的才能自行获取任何更改而无需任何代码修改。
Category UOM A UOM B UOM C UOM D
-----------------------------------------------------------
Article | Apple | Mango 0 0 1 0
Pear | Melon | Branch 1 0 0 0
Ball | Box | Table 0 1 0 0
Pear | Melon | Branch 0 0 1 0
Ball | Box | Table 0 0 0 0
Article | Apple | Mango 0 1 1 0
Pear | Melon | Branch 0 0 0 0
Ball | Box | Table 0 1 1 0
Ball | Box | Table 1 0 0 0
Article | Apple | Mango 0 0 0 1
到目前为止,我尝试的是分别对每一列求和,然后添加到新表中。代码似乎在遍历并对数字求和,但没有将结果列添加到新表中。
if object_id ('tempdb..##TempSummary2') is not null
drop table ##TempSummary2
select distinct category into ##TempSummary2 from ##TempSummary
--select * from ##TempSummary2
declare @column as varchar(128);
declare @counter int;
declare @sql varchar(max);
set @counter = 8;
while @counter < 10
begin
select @column = c.name
from tempdb.sys.columns c
inner join tempdb.sys.tables t on c.object_id = t.object_id
where t.name = '##TempSummary'
and c.column_id = @counter
set @sql = 'select a.*, sum([' + @column + ']) as [' + @column + '] from ##TempSummary2 a
left join ##TempSummary b on a.category = b.category
group by a.category'
set @counter = @counter + 1
end
exec (@sql)
所以我期待像下面这样的总结
Category UOM A UOM B UOM C UOM D
------------------------------------------------------------
Article | Apple | Mango 0 1 2 1
Pear | Melon | Branch 1 2 1 0
Ball | Box | Table 1 0 1 0
【问题讨论】:
-
SQL 是一种基于集合的语言。很少有任何理由使用循环。解释你想要达到的目标,而不是你应该怎么做。你是如何从只有几个 1 和 0 到第二行的 1567 个东西的原始数据中得到的?表和列是什么样的? 7 列只有 5 个标题
-
或者垂直条是单个单元格值的一部分,而不是不同的列?在这种情况下,这就是你的问题。这是数据库中最基本的错误。一个单元格应该包含一个原子值。如果不是不同的表,不同类型的数据应该放在不同的列中。
-
抱歉,应该澄清一下,用竖线分隔的单词连接成单列以获得产品的唯一路径
-
或许您最好向我们提供一些可消耗的样本数据(表格格式
text或 DDL 和 DML 语句)以及一些可读预期结果。跨度> -
如果是这种情况,@krokos 会格式化您的示例数据,以便标题和列对齐。您的数据看起来像
'Mango'位于UOM B和UOM C列中,并且值为'0 0'。你如何“总结”'0 0'和'0 1'在一起?
标签: sql-server tsql while-loop dynamic-sql