【问题标题】:Code looping through the column, but doesn`t add the result to the new table代码循环遍历列,但不将结果添加到新表中
【发布时间】: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 BUOM C 列中,并且值为'0 0'。你如何“总结”'0 0''0 1' 在一起?

标签: sql-server tsql while-loop dynamic-sql


【解决方案1】:

您可以使用简单的 SUM AGGREGATION 和 GROUP BY 来获得所需的输出,如下所示-

注意:如果您的类别位于一个表中,则只能在选择和 GROUP BY 子句中使用该单个列名。

WITH your_table(Category1,Category2,Category3,[UOM A],[UOM B],[UOM C],[UOM D])
AS
(
    SELECT 'Article','Apple','Mango',0,0,1,0 UNION ALL
    SELECT 'Pear','Melon','Branch',1,0,0,0 UNION ALL
    SELECT 'Ball','Box','Table',0,1,0,0 UNION ALL
    SELECT 'Pear','Melon','Branch',0,0,1,0 UNION ALL
    SELECT 'Ball','Box','Table',0,0,0,0 UNION ALL
    SELECT 'Article','Apple','Mango',0,1,1,0 UNION ALL
    SELECT 'Pear','Melon','Branch',0,0,0,0 UNION ALL
    SELECT 'Ball','Box','Table',0,1,1,0 UNION ALL
    SELECT 'Ball','Box','Table',1,0,0,0 UNION ALL
    SELECT 'Article','Apple','Mango',0,0,0,1
)

SELECT Category1,Category2,Category3 ,
SUM([UOM A]) UOM_A,SUM([UOM B]) UOM_B,SUM([UOM C]) UOM_C,SUM([UOM D]) UOM_D
FROM your_table
GROUP BY Category1,Category2,Category3

输出是-

Category1   Category2   Category3   UOM_A   UOM_B   UOM_C   UOM_D
Article     Apple       Mango       0       1       2       1
Ball        Box         Table       1       2       1       0
Pear        Melon       Branch      1       0       1       0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 2019-09-21
    • 2021-08-04
    • 2013-09-14
    • 2019-02-18
    • 1970-01-01
    相关资源
    最近更新 更多