【问题标题】:SQL loop for each column in a table表中每一列的 SQL 循环
【发布时间】:2016-11-13 17:59:30
【问题描述】:

假设我有一张桌子叫:

TableA

表中存在以下列:

Column1, Column2, Column3 

我想要完成的是查看有多少记录不为空。

为此,我有以下案例陈述:

sum(Case when Column1 is not null then 1 else 0 end)

我想要的是针对提供的列表中存在的每个表的上述 case 语句,并为表中存在的每个列运行。

因此,对于上面的示例,case 语句将针对 Column1、Column2 和 Column3 运行,因为该特定表中有 3 列等

但我想指定一个表列表以循环执行上述逻辑

【问题讨论】:

  • 想展示一些示例数据吗?
  • 嗨,对不起,我在家,但它需要工作,所以我没有可用的实际数据样本,但这一直困扰着我,但我想明天回去时对其进行排序工作大声笑。基本上想遍历我在查询中指定的每一列,并将每一列相加。
  • SQL 不允许您在查询中使用变量来提供表名或列名。您需要用其他语言编写一些软件来为每个表生成查询。
  • 我有点想,实际上,已经连续看了几十个小时,但找不到任何东西,只是放心地知道这是不可能的,而不是希望有办法哈哈

标签: sql tsql sql-server-2008


【解决方案1】:
create procedure tab_cols (@tab nvarchar(255))
as
begin

    declare     @col_count  nvarchar(max) = ''
               ,@col        nvarchar(max) = ''

    select      @col_count += case ORDINAL_POSITION when 1 then '' else ',' end + 'count(' +  QUOTENAME(COLUMN_NAME,']') + ') as ' + QUOTENAME(COLUMN_NAME,']')
               ,@col       += case ORDINAL_POSITION when 1 then '' else ',' end + QUOTENAME(COLUMN_NAME,']')
    from        INFORMATION_SCHEMA.COLUMNS
    where       TABLE_NAME = @tab
    order by    ORDINAL_POSITION

    declare     @stmt nvarchar(max) = 'select * from (select ' + @col_count + ' from ' + @tab + ') t unpivot (val for col in (' + @col + ')) u'

    exec sp_executesql @stmt
end

【讨论】:

  • 太棒了,谢谢它给了我我需要的东西,但一次运行存储过程的表。有没有办法查看给定的目录表名列表?不确定这是否可以通过游标或基于集合来完成?
  • @abs786123,是的,使用光标。只是提醒您可以将过程的结果插入到表格中。
  • 太棒了,只是想弄清楚你的逻辑,哈哈,很棒的东西
  • 我喜欢这个解决方案 (1+)。旁注:(1) ] 是默认引号字符,在调用 QUOTENAME 时无需指定它。 (2) 您没有考虑架构名称。
  • @TT。 (1) 我不喜欢依赖默认行为。这并不意味着我不会偶尔掉进这个坑,而是我更喜欢代码清晰安全。 (2) 这只是一个 POC,如果您愿意,可以随意编辑。
【解决方案2】:

这不是很容易吗?

SELECT AccountID
      ,SUM(Total) AS SumTotal
      ,SUM(Profit) AS SumProfit
      ,SUM(Loss) AS SumLoss
FROM tblAccount
GROUP BY AccountID

如果我理解正确,您希望得到总和,但不是一次性获得所有行,而是每个 accountID 分别。这就是GROUP BY 的用途……

如果可能,尽量避免使用循环、游标和其他程序方法...

更新:不同表的通用方法

对于不同的表,您可能 - 完全需要我上面显示的语句,但您必须动态生成它并使用 EXEC 来执行它。您可以通过INFORMATION_SCHEMA.COLUMNS 获取列名...

但是:

  • 这个脚本应该如何一般地知道应该总结哪些列?您可能会前往data_type like 'decimal%' 或类似...
  • GROUP BY 中的其他列及其用法如何?
  • 您希望如何放置别名
  • 您想如何继续处理未知结构的表?

老实说:我认为,对于这种情况,没有 真正的通用一体 方法......

【讨论】:

  • 我认为该操作正在根据评论寻找运行总和。
  • 会是,但我有一堆相似的表,它们的结构与我打算通过的相同。所以我希望获得循环的逻辑,以便可以在一个存储过程中完成。对不起,如果我还不清楚这部分。
  • 不,它不是一个流动的总和,否则我可以沿着 sum()over(etc order by) 的路线走,但我想要一个可以重用于我需要去的所有其他表的逻辑通过具有相同的结构和列类型。
  • @abs786123,不,您绝对对此并不清楚...查看我的更新
  • 嗨,我已经完全更新了这个问题,以便深入了解我想要实现的目标。谢谢
猜你喜欢
  • 2015-04-14
  • 2021-07-27
  • 1970-01-01
  • 1970-01-01
  • 2014-04-20
  • 1970-01-01
  • 2018-07-19
  • 1970-01-01
  • 2023-02-24
相关资源
最近更新 更多