0

我有一个表,其中有一个整数列,我试图从中获取一些计数。基本上我需要来自同一列的四个单独的计数。我需要返回的第一个值是有多少记录在此列中存储在两个值(例如 213 和 9999)之间的整数值,包括最小值和最大值。我需要返回的其他三个计数值只是该列不同值之间的记录计数。我试过做这样的查询......

SELECT (SELECT Count(ID) FROM view1 WHERE ((MyIntColumn BETWEEN 213 AND 9999));)
AS Value1, (SELECT Count(ID) FROM FROM view1 WHERE ((MyIntColumn BETWEEN 500 AND 600));) AS Value2 FROM view1; 

例如,有 10 条记录,该列的值在 213 和 9999 之间。从这个查询返回的结果给了我 10,但它给了我相同的值 10,618 倍,这是表中的总记录数。我怎么可能只让它返回 10 条记录呢?

4

4 回答 4

2
SELECT
COUNT(CASE 
     WHEN MyIntColumn >= 213 AND MyIntColumn <= 9999 
     THEN MyIntColumn 
     ELSE NULL 
     END) AS FirstValue
, ??? AS SecondValue
, ??? AS ThirdValue
, ??? AS FourthValue
FROM Table

这不需要嵌套或 CTE 或任何东西。只需通过 CASE 在 COUNTs 参数中定义您的条件。

我真的不明白你在第二、第三和第四列想要什么。在我看来,它与第一个非常相似。

于 2013-05-13T12:30:05.173 回答
2

使用 Iif() 函数而不是 CASE WHEN

     select  Condition1: iif( ),   condition2: iif(  ),  etc

PS:我在使用 Access 时所做的是将 iif() 解析为 1 或 0,然后执行 SUM() 以获取计数。回旋处,但它在聚合方面效果更好,因为它避免了空值。

于 2013-05-13T12:46:27.140 回答
0

重新格式化后,您的查询如下所示:

SELECT  (
        SELECT  Count(ID) 
        FROM    view1 
        WHERE   MyIntColumn BETWEEN 213 AND 9999
        ) AS Value1 
FROM    view1; 

因此,您正在选择与外部查询无关的子查询表达式。对于 中的每一行view1,您计算 中的行数view1

相反,尝试进行一次计算。你只需要删除你的外部查询:

SELECT  Count(ID) 
FROM    view1 
WHERE   MyIntColumn BETWEEN 213 AND 9999;
于 2013-05-13T12:31:11.240 回答
0

MS Access 中的 OLEDB 连接不支持关键字 CASE 和 WHEN 。

您只能使用 iif() 函数来计算同一列中的两个、三个 .. 值

SELECT Attendance.StudentName, Count(IIf([Attendance]![Yes_No]='Yes',1,Null)) AS Yes, Count(IIf([Attendance]![Yes_No]='No',1,Null)) AS [No], Count(IIf([Attendance]![Yes_No]='Not',1,Null)) AS [Not], Count(IIf([Attendance]![Yes_No],1,Null)) AS Total

从出勤组按出勤.学生姓名;

于 2017-09-06T11:10:53.437 回答