如何使用Access中的SQL从同一列获取三个计数值?

时间:2013-05-13 12:23:53

标签: sql ms-access count subquery

我有一个包含整数列的表,我试图从中获取一些计数。基本上我需要来自同一列的四个单独的计数。我需要返回的第一个值是在两列值(如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; 

例如,有十个记录,这个列的值在213和9999之间。从这个查询返回的结果给了我10,但它给了我相同的值10,618次,这是总记录的数量桌子。我怎么可能只返回一个10的记录呢?

4 个答案:

答案 0 :(得分: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参数中的条件。

我真的不明白你想要的第二,第三和第四列。对我而言,它与第一个非常相似。

答案 1 :(得分:2)

使用Iif()函数代替CASE WHEN

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

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

答案 2 :(得分: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;

答案 3 :(得分: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

出席 GROUP BY Attendance.StudentName;