Sql 对单行中的非空列进行计数并取平均值

Sql 对单行中的非空列进行计数并取平均值,sql,linq,sql-server-2008,Sql,Linq,Sql Server 2008,我想计算每行中非空列的平均数 例如,我有一张这样的桌子 Name | a | b | c | d | e | f | | | | | | | | umar | 2 |null| 3 | 5 | null| 4 | ali |null|null| 3 |null| 1 | 4 | ali |null|null| 3 |null| null| 4 | 结果应该是 Name | a | b | c | d |

我想计算每行中非空列的平均数 例如,我有一张这样的桌子

Name | a  | b  | c  | d  | e   | f |
     |    |    |    |    |     |   |
umar | 2  |null| 3  | 5  | null| 4 |
ali  |null|null| 3  |null| 1   | 4 |
ali  |null|null| 3  |null| null| 4 |
结果应该是

    Name | a  | b  | c  | d  | e   | f | average
         |    |    |    |    |     |   |
    umar | 2  |null| 3  | 5  | null| 4 |  3.5
    ali  |null|null| 3  |null| 1   | 4 |  2.66
    ali  |null|null| 3  |null| null| 4 | 3.5
您可以为此使用大小写表达式:

select ((case when a is not null then 1 else 0 end) +
        (case when b is not null then 1 else 0 end) +
        (case when c is not null then 1 else 0 end) +
        (case when d is not null then 1 else 0 end) +
        (case when e is not null then 1 else 0 end) +
        (case when f is not null then 1 else 0 end)
       ) as NumNotNull
您可以使用CASE表达式:

如果您不想计算平均值,但计算平均值,您已更改问题:

var query = 
     from x in table
     let NotNullColCount = (x.a == null ? 0 : 1) + (x.b == null ? 0 : 1) + (x.c == null ? 0 : 1) + (x.d == null ? 0 : 1) + (x.e == null ? 0 : 1) + (x.f == null ? 0 : 1)
     let NotNullColSum = (x.a ?? 0) + (x.b ?? 0) + (x.c ?? 0) + (x.d ?? 0) + (x.e ?? 0) + (x.f ?? 0)
     select new 
     {
        AverageNotNull = NotNullColCount == 0 
                         ? 0.0 
                         : 1.0 * NotNullColSum / NotNullColCount 
     };

如果列数很大,也可以使用动态查询

声明@SQL NVARCHARmax; SET@SQL='选择Tablename.Columnname',+ 填充选择“+QUOTENAMECOLUMN”时的“+CASE” '为空,则为1,否则为0结束' 从信息_SCHEMA.COLUMNS 其中,对于XML路径1,1, +“来自表名”;
EXEC@SQL;

下面的SQL可能会帮助您:

SELECT  Name
      , a
      , b
      , c
      , d
      , e
      , f
      , CONVERT(FLOAT, ( tab.a1 + tab.b1 + tab.c1 + tab.d1 + tab.e1 + tab.f1 )) / CONVERT(FLOAT, ( tab.a2 + tab.b2
                                                                                                   + tab.c2 + tab.d2
                                                                                                   + tab.e2 + tab.f2 )) AS [average]
FROM    ( SELECT    Name
                  , a
                  , b
                  , c
                  , d
                  , e
                  , f
                  , CASE WHEN a IS NULL THEN 0
                         ELSE a
                    END AS a1
                  , CASE WHEN b IS NULL THEN 0
                         ELSE b
                    END AS b1
                  , CASE WHEN c IS NULL THEN 0
                         ELSE c
                    END AS c1
                  , CASE WHEN d IS NULL THEN 0
                         ELSE d
                    END AS d1
                  , CASE WHEN e IS NULL THEN 0
                         ELSE e
                    END AS e1
                  , CASE WHEN f IS NULL THEN 0
                         ELSE f
                    END AS f1
                  , CASE WHEN a IS NULL THEN 0
                         ELSE 1
                    END AS a2
                  , CASE WHEN b IS NULL THEN 0
                         ELSE 1
                    END AS b2
                  , CASE WHEN c IS NULL THEN 0
                         ELSE 1
                    END AS c2
                  , CASE WHEN d IS NULL THEN 0
                         ELSE 1
                    END AS d2
                  , CASE WHEN e IS NULL THEN 0
                         ELSE 1
                    END AS e2
                  , CASE WHEN f IS NULL THEN 0
                         ELSE 1
                    END AS f2
          FROM      YourTable
        ) tab

谢谢如果我想取每行和非空列的平均值除以非空计数@sagiMmm yea,用另一个查询结束它,SUMnot_null_count/count*@MuhammadTauseenI更新了我的问题。请检查我想要的结果@sagi@MuhammadTauseen:我已根据您更改的问题进行了更新。SQL SERVER中不存在Null函数
var query = 
     from x in table
     let NotNullColCount = (x.a == null ? 0 : 1) + (x.b == null ? 0 : 1) + (x.c == null ? 0 : 1) + (x.d == null ? 0 : 1) + (x.e == null ? 0 : 1) + (x.f == null ? 0 : 1)
     let NotNullColSum = (x.a ?? 0) + (x.b ?? 0) + (x.c ?? 0) + (x.d ?? 0) + (x.e ?? 0) + (x.f ?? 0)
     select new 
     {
        AverageNotNull = NotNullColCount == 0 
                         ? 0.0 
                         : 1.0 * NotNullColSum / NotNullColCount 
     };
SELECT  Name
      , a
      , b
      , c
      , d
      , e
      , f
      , CONVERT(FLOAT, ( tab.a1 + tab.b1 + tab.c1 + tab.d1 + tab.e1 + tab.f1 )) / CONVERT(FLOAT, ( tab.a2 + tab.b2
                                                                                                   + tab.c2 + tab.d2
                                                                                                   + tab.e2 + tab.f2 )) AS [average]
FROM    ( SELECT    Name
                  , a
                  , b
                  , c
                  , d
                  , e
                  , f
                  , CASE WHEN a IS NULL THEN 0
                         ELSE a
                    END AS a1
                  , CASE WHEN b IS NULL THEN 0
                         ELSE b
                    END AS b1
                  , CASE WHEN c IS NULL THEN 0
                         ELSE c
                    END AS c1
                  , CASE WHEN d IS NULL THEN 0
                         ELSE d
                    END AS d1
                  , CASE WHEN e IS NULL THEN 0
                         ELSE e
                    END AS e1
                  , CASE WHEN f IS NULL THEN 0
                         ELSE f
                    END AS f1
                  , CASE WHEN a IS NULL THEN 0
                         ELSE 1
                    END AS a2
                  , CASE WHEN b IS NULL THEN 0
                         ELSE 1
                    END AS b2
                  , CASE WHEN c IS NULL THEN 0
                         ELSE 1
                    END AS c2
                  , CASE WHEN d IS NULL THEN 0
                         ELSE 1
                    END AS d2
                  , CASE WHEN e IS NULL THEN 0
                         ELSE 1
                    END AS e2
                  , CASE WHEN f IS NULL THEN 0
                         ELSE 1
                    END AS f2
          FROM      YourTable
        ) tab