计算值在列中出现的次数

Count number of times value appears in columns

由于某些奇怪的情况,我的 Microsoft Access 数据库中的随机长文本字段似乎已损坏并被替换为“################”。我希望能够使用 SQL 查询来计算损坏字段的数量,以便我可以快速检查该数字是否已更改。

我编写了一个查询,可以计算具有损坏值的记录数,但不能计算总字段数(例如,如果 5 条记录有 13 个损坏值,我可以获得数字 5,但我希望总数为 13 ).如何调整我的查询?

SELECT Count(*) AS [Number of Errors] 
FROM GPInformation 
WHERE Profile="################" 
   OR Notes="################" 
   OR CriminalConvictionsNotes="################" 
   OR HealthIssueNotes="################" 
   OR NextOfKinAddress="################"

输出:

这是unpivoting数据

的一种方式
SELECT Count(error_data) AS [Number of Errors] 
FROM   (SELECT 1 AS error_Data 
        FROM   gpinformation 
        WHERE  profile = "################" 
        UNION ALL 
        SELECT 1 
        FROM   gpinformation 
        UNION ALL 
        SELECT 1 
        FROM   gpinformation 
        WHERE  notes = "################" 
        UNION ALL 
        SELECT 1 
        FROM   gpinformation 
        WHERE  criminalconvictionsnotes = "################" 
        UNION ALL 
        SELECT 1 
        FROM   gpinformation 
        WHERE  healthissuenotes = "################" 
        UNION ALL 
        SELECT 1 
        FROM   gpinformation 
        WHERE  nextofkinaddress = "################") A 

您可以将条件逻辑添加到 select:

SELECT (sum(iif(Profile = "################", 1, 0)) +
        sum(iif(Notes = "################", 1, 0)) +
        sum(iif(CriminalConvictionsNotes = "################", 1, 0)) +
        sum(iif(HealthIssueNotes = "################", 1, 0)) +
        sum(iif(NextOfKinAddress = "################", 1, 0))
       ) AS NumBadValues        
FROM GPInformation 
WHERE Profile = "################" OR
      Notes = "################" OR
      CriminalConvictionsNotes = "################" OR
      HealthIssueNotes = "################" OR
      NextOfKinAddress = "################";

您可以按如下方式重写查询:

SELECT SUM( 
   IIf(Profile="################", 1, 0) +
   IIf(Notes="################", 1, 0) +
   IIf(CriminalConvictionsNotes="################", 1, 0) +
   IIf(HealthIssueNotes="################", 1, 0) + 
   IIf(NextOfKinAddress="################", 1, 0))
  AS [Number of Errors] 
FROM GPInformation 
WHERE Profile="################" 
   OR Notes="################" 
   OR CriminalConvictionsNotes="################" 
   OR HealthIssueNotes="################" 
   OR NextOfKinAddress="################"

我没有测试过这段代码(缺乏立即执行此操作的便利),但它应该可以工作或者至少非常接近正确。