SQL 查询返回填充了最多列的行

Posted

技术标签:

【中文标题】SQL 查询返回填充了最多列的行【英文标题】:SQL Query to return rows with the most columns populated 【发布时间】:2020-07-16 20:29:04 【问题描述】:

Azure SQL Server 2019。

我们有一个表 Table1,其中包含超过 100 列不同类型的 nvarchar 数据,所有这些都是允许的 NULL 值,并且在给定记录中可以填充 1 到 100 列。我需要制定一个查询,以降序返回按列中有多少列排序的行。

我开始使用DATALENGTH 并且必须输入每一列的名称,但我只能想象必须有一种更有效的方法。假设列名是column1column2column3 等,我将如何完成此操作?

【问题讨论】:

请确保您的问题包含minimal reproducible example,即样本数据、预期结果和您的尝试。 不是 sql server exprt(还!),但你不能查询 sys.columns 吗? docs.microsoft.com/en-us/sql/relational-databases/… 您可以旋转表格,以便每个键有 100 多个单独的行,并计算非空值并按 PK 分组。 @Manakin 感谢您的链接,我也绝对不是专家! 如果性能不是优先级,那么您可以尝试使用动态 sql 查询来组合查询。取消透视仍需要您手动列出所有 100 列。 【参考方案1】:

横向连接将列转换为行怎么样?这需要仅枚举列一次,如下所示:

select t.*, c.cnt
from mytable t
cross apply (
    select count(*) cnt
    from (values (t.column1), (t.column2), (t.column3)) x(col)
    where col is not null
) c
order by c.cnt desc

【讨论】:

以上是关于SQL 查询返回填充了最多列的行的主要内容,如果未能解决你的问题,请参考以下文章

DART SQL 如何从 Dart 中的 SQL 查询结果中读取多行值(多列)?

SQL 中多列“级联”约束的优雅语法?

JPQL JOIN 查询对应值的行数(多列)

sql查询 表中一列不重复 显示多列

SQL中的Group By的查询过程多列分组的查询过程是怎样的?

从 SQL 表中删除重复的行(基于多列的值)