如何为每个表计算由 SQL Server 中未指定数量的表共享的列中的不同值?

Posted

技术标签:

【中文标题】如何为每个表计算由 SQL Server 中未指定数量的表共享的列中的不同值?【英文标题】:How to count, for every table, distinct values in a column that is shared by an unspecified number of tables in SQL Server? 【发布时间】:2020-06-03 18:02:41 【问题描述】:

我在 SQL Server 数据库中的视图数量不定且不确定,其中有一列名为“CONFIDENCE”。对于该集合中的每个视图,我想计算不同值在该列中出现的频率。

我知道如何找到所有具有“CONFIDENCE”列的视图...

select  c.table_schema as schema_name,
        c.table_name as name
  from  information_schema.columns c
  join  information_schema.tables t
    on  c.table_name = t.table_name
 where  c.column_name = 'confidence' 
        and t.table_type = 'view'

而且我知道如何计算单个视图的不同值...

  select distinct confidence,
         count(*) as occurrences
    from schema.view_name
group by confidence
order by confidence;

但我不知道如何将两者联系起来。我怀疑这与cross applyunion all 有关,但我只能找到合并固定数量对象的资源。

【问题讨论】:

【参考方案1】:

你需要知道一个查询的答案才能编写另一个查询,你可以用一点 DSQL 来解决这个问题。

DECLARE @SQL NVARCHAR(MAX) = ''

SELECT @SQL = @SQL + 'UNION ALL SELECT ''' + c.table_schema + '.' + c.table_name + ''' tbl, confidence, count(*) as occurrences FROM [' + c.table_schema + '].[' + c.table_name + '] GROUP BY confidence
'
FROM information_schema.columns c
JOIN information_schema.tables t ON c.table_name = t.table_name
WHERE c.column_name = 'confidence' 
    AND t.table_type = 'view'

SET @SQL = RIGHT(@SQL, LEN(@SQL) - 9)
EXEC sp_executesql @SQL

【讨论】:

这几乎可以工作。我如何将所有结果合并到一个结果集中?现在我有 65 个视图,这会输出 65 个结果。 行得通,谢谢!我必须删除 9 个字符,而不是 10 个。 出于好奇,你认为有没有办法在没有动态 sql 的情况下做到这一点? 代码块已编辑。在不使用 DSQL 的情况下,我看不到在 T-SQL 中执行此操作的方法。

以上是关于如何为每个表计算由 SQL Server 中未指定数量的表共享的列中的不同值?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 SQL Server 访问配置 ngrok

SQL Server Profiler:如何为“不喜欢”列过滤器指定多个值

如何为xml节点sql server选择每个值

EF 5 + SQL Server CE 4:如何为数据库文件指定自定义位置?

如何为包含所有存储行的现有 SQL Server 表生成 INSERT 脚本?

在 SQL Server 中,如何为给定表生成 CREATE TABLE 语句?