【问题标题】:Select statistical operations on table without knowing column names在不知道列名的情况下选择表上的统计操作
【发布时间】:2017-07-17 21:41:38
【问题描述】:

我正在分析一些表格的数据质量,包括最小值、最大值、平均值、标准偏差等量化指标。

如何在不知道表列名称的情况下对所有表列选择不同的统计操作(最小值、最大值、标准偏差...)

比如:

选择 min(col1), max(col1), stdev(col1), min(col2)... , min(colN) 从表1

但是对列名进行动态引用,因为我必须在许多具有不同列名的表上运行它,而且我不想每次都更改代码。

我正在使用 SQL Management Studio。

非常感谢你

【问题讨论】:

  • 您可以使用动态 SQL 来构造查询。但一般情况下,您需要列名来编写表达式。
  • 您可以在 sys 表中使用动态 sql 和游标,但这可能会变得非常混乱并且需要很长时间才能运行
  • 即使您确实使用动态 SQL 进行了此操作,由于每个表中的列数不同,这将返回一个非常难以使用的结果集。你到底想完成什么?可能有一种更符合 SQL 的方式来实现它。
  • 更不用说你会在这里跳过一些严重的障碍。您不能对许多不同的数据类型执行 STDEV 之类的操作。
  • 感谢您的意见!我是动态 SQL 的新手。同样,我要完成的是对许多表中许多列的值的标准分析,我不写每个列名

标签: sql sql-server


【解决方案1】:

嗯,这是一种相当合理的方法来做这样的事情:
注意您需要将其余的数字数据类型添加到此示例中。

DECLARE @SQL nvarchar(max) = '';

SELECT @SQL = @SQL + 
'
UNION ALL
SELECT '''+ TABLE_NAME +''' As TableName, 
       '''+ COLUMN_NAME +''' As ColumnName, 
       MIN('+ COLUMN_NAME +') As [Min], 
       MAX('+ COLUMN_NAME +') As [Max], 
       STDEV('+ COLUMN_NAME +') As [STDEV]
FROM '+ TABLE_NAME
FROM information_schema.columns
WHERE DATA_TYPE IN('tinyint', 'smallint', 'int', 'bigint') -- Add other numeric data types 

SELECT @SQL = STUFF(@SQL, 1, 11, '') -- Remove the first `UNION ALL` from the query

EXEC(@SQL)

这个查询的结果将是这样的:

TableName   ColumnName  Min     Max     STDEV
Table1      Col1        -123    543     100
Table1      Col2        54      72      5
Table1      Col3        0       1000    100

【讨论】:

  • 非常感谢佐哈尔!它有效,但“information_schema.columns”向我显示来自“系统数据库”的信息/表,而不是我正在使用的数据库。如何为“information_schema.columns”指定数据库?
  • 阅读使用声明。您也可以这样做:database.information_schema.columns。当然你需要用你的数据库名称替换数据库。
猜你喜欢
  • 1970-01-01
  • 2013-07-26
  • 1970-01-01
  • 2020-09-25
  • 1970-01-01
  • 2014-12-07
  • 2020-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多