sql—给定表中给定行中的空值百分比

puruo6ea  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(317)

我需要创建一个标量函数,给它一个表名和一个行id,并返回同一个表中给定行中空值的百分比,知道如何在sql server中这样做吗,
原因是向用户展示他们仍然需要插入的数据有多大。
例如:桌上学生

ID_STUDENT | FNAME | LNAME | AGE | CITY
1 | KHALID |      SMITH |  25   |LA
2 |   ADAM |      NULL  |  NULL |NY
3 |   SARA |      KAMAL |   23  |Null
4 |   Null |       Null | Null  |Null

SELECT NULL_CALC(STUDENT,ID_STUDENT,1) ===> 0%
SELECT NULL_CALC(STUDENT,ID_STUDENT,2) ===> 50%
SELECT NULL_CALC(STUDENT,ID_STUDENT,3) ===> 25%
SELECT NULL_CALC(STUDENT,ID_STUDENT,4) ===> 100%

谢谢大家

ki0zmccv

ki0zmccv1#

用户定义函数中不能有动态sql。必须编写存储过程。下面的代码适用于任何表。但是,我建议您对以下程序进行适当的错误处理和其他操作。
数据设置

CREATE TABLE studentPercentage(studentId int, Fname varchar(30), LName varchar(30),
Age tinyint, city varchar(30))

insert into studentPercentage 
values (1 ,'KHALID', 'SMITH' ,  25   ,'LA'),
(2 ,'ADAM',     NULL  , NULL ,'NY'),
(3 ,'SARA',      'KAMAL' ,   23  ,Null),
(4 ,Null,       Null , Null  ,Null);

程序定义

CREATE PROCEDURE dbo.NULL_CALC
@tableName sysname,
@Idcolumn sysname,
@IdValue INT
AS
BEGIN
DECLARE @percentagestmt VARCHAR(max) = 'SELECT ('
DECLARE @countOfColumns INT = (SELECT COUNT(c.name) FROM
sys.tables as t
inner join sys.columns as c
on c.object_id = t.object_id
WHERE t.name = @tableName)

SELECT @percentagestmt += 'CASE WHEN '+ c.name + ' IS NOT NULL THEN 1 ELSE 0 END +'
FROM sys.tables as t
inner join sys.columns as c
on c.object_id = t.object_id
WHERE t.name = @tableName

SET @percentagestmt = LEFT(@percentageStmt,LEN(@percentagestmt) -1)

SET @percentagestmt += ') * 100 /' + CAST(@countOfColumns AS VARCHAR(10)) + ' AS RowNullPercentage FROM ' + @tableName + ' WHERE ' + @Idcolumn + '=' + cast(@Idvalue as varchar(10))

EXEC(@percentagestmt)
END

过程调用

EXEC dbo.NULL_CALC 'StudentPercentage','StudentId',1

结果集

+-------------------+
| RowNullPercentage |
+-------------------+
|               100 |
+-------------------+
n6lpvg4x

n6lpvg4x2#

你可以总结一下 CASE 此处的表达式用于查找百分比:

SELECT
    ID_STUDENT,
    100.0 * (CASE WHEN FNAME IS NULL THEN 1 ELSE 0 END +
             CASE WHEN LNAME IS NULL THEN 1 ELSE 0 END +
             CASE WHEN AGE   IS NULL THEN 1 ELSE 0 END +
             CASE WHEN CITY  IS NULL THEN 1 ELSE 0 END) / 4 AS pct_null
FROM STUDENT;

演示

相关问题