计算每行有多少列“不为空”,并将该信息放入另一列中

本文关键字:信息 一列 多少 不为空 计算 | 更新日期: 2023-09-27 18:32:19

我是SQL的新手,并且已经开始了一个测试项目来亲自动手使用SQL和C#。我一直在使用VS2012的数据库向导来设置所有内容。所以这是我的设置的概要。

SQL CE 表名为 ACDTable,它通过数据集dataSet1和表适配器连接到我的 C# 项目dataTableAdapter

ACDTable有 22 列,我试图做的是对于我指定的每列都有一个值(不为 null)的每一行,它将一添加到计数器中,然后将总和添加到我指定的另一列中。

本质上,我需要找到每行有多少列不为 null,并将该数字转换为 C# 中可用的数字。

例:

 |Col1 | Col2 | Col3| Col4| Col5|
 |     |      |     |     |     |
 |  x  |   x  |     |  x  |  3  |
 |     |   x  |  x  |     |  2  |
 |  x  |      |     |     |  1  |

我正在使用示例 每行中的非空列计数,如果我只是通过 SQL 将其作为查询运行,它确实效果很好。

我正在使用的示例:

SELECT   Col1,
         Col2,
         Col3,
         Col4,

     CASE WHEN Col1 IS NOT NULL THEN 1 ELSE 0 END + 
     CASE WHEN  Col2 IS NOT NULL THEN 1 ELSE 0 END + 
     CASE WHEN  Col3 IS NOT NULL THEN 1 ELSE 0 END + 
     CASE WHEN  Col4 IS NOT NULL THEN 1 ELSE 0 END AS Col5
 FROM     ACDTable

我遇到的问题是,当我使用 Visual Studio 创建基于此查询的方法时,我尝试通过该方法获取Col5的值,我得到了一个 NullDB 异常。如果我在调用该方法后运行调试器并查看表,则Col5为完全 null。我有一种感觉,问题是查询本身实际上并没有改变第 5 列,但我对 SQL 缺乏经验,我无法找出正确的语法来解决这个问题。

修复了我在选择列表中有 Col5 的拼写错误

编辑以显示我正在使用的代码

该方法本身是 Visual Studio 使用表适配器中的"添加查询"选项生成的方法。如果我理解正确,应该运行上述查询,然后将值放入Col5中。然后,我只想使用

GetTotals(); //The Generated method from VS that runs my query
var totals = from p in dataTable select p.Col5;
   foreach (var total in totals)
     {
       testTextBox.Text = total
     }

计算每行有多少列“不为空”,并将该信息放入另一列中

如果我正确理解了您的评论,那么我就知道问题出在哪里了。此时,您只是从表中选择值,而不将任何值写入其中。执行此操作的一种方法是创建 UPDATE 查询并将 Col5 的值设置为 case 语句。

UPDATE ACDTable
SET Col5 = CASE WHEN....

我想你知道如何完成这个。如果有必要,您仍然可以在末尾添加 WHERE 子句。

您在选择列表中Column 5了两次。 一次作为命名列,一次作为计算列。 您是在创建这篇文章时打错字,还是以这种方式在您的代码中?

因为 Col5 没有案例(条件)。你有col1,col2,col3,col4,没有col5,你只是将col4名称指定为col5,在这种情况下这是一个坏主意。