访问sql以检索满足条件的值的计数

时间:2019-02-13 20:25:53

标签: sql ms-access count

我正在尝试在Access中编写一个查询,该查询将为表中值超过指定级别的每个站点返回值的计数,但是,对于没有值超过该级别的站点,则返回一个指定的值值,例如"NA"

我尝试了IifSwitchUnion子查询,查询了另一个查询,但是没有运气。我可以获取所有超过该级别的计数,或者所有"NA"正确的站点,但显示其余的总数,而不只是显示高于该级别的计数。

例如,在下表中,假设级别> 10,休斯顿=“ NA”,底特律= 2,匹兹堡PA =3。我只是无法使查询的两面都起作用。

如果格式不正确,请先道歉。

+-----------------+-------+
|     1. Site     | Value |
+-----------------+-------+
|  2. Houston     |    10 |
|  3. Houston     |     3 |
|  4. Houston     |     0 |
|  5. Detroit     |    15 |
|  6. Detroit     |     7 |
|  7. Detroit     |     4 |
|  8. Detroit     |    12 |
|  9. Pittsburgh  |    23 |
|  10. Pittsburgh |     2 |
|  11. Pittsburgh |    18 |
|  12. Pittsburgh |    12 |
+-----------------+-------+

4 个答案:

答案 0 :(得分:0)

  1. 获取与计数无关的所有网站的列表(下面的SiteList派生表)
  2. 向左将其重新加入到基表(SiteValues)中,以获取达到阈值的每个站点的计数。 --note应该连接到我不确定该表的键上。仅网站还不够
  3. 对siteValues数据集中的值进行计数,因为NULL将被计为0。

工作DEMO

SELECT SiteList.Site, Count(Sitevalues.Site)
FROM (SELECT site, value
      FROM TableName) SiteList
LEFT JOIN TableName SiteValues
 on SiteList.Site = SiteValues.Site
 and SiteValues.Value > 10
 and SiteValues.Value = SiteList.value
GROUP BY SiteList.Site

赠予我们

+----+------------+------------------+
|    |    Site    | (No column name) |
+----+------------+------------------+
|  1 | Detroit    |                2 |
|  2 | Houston    |                0 |
|  3 | Pittsburgh |                3 |
+----+------------+------------------+

或者,如果您需要NA,则必须将计数转换为varchar

SELECT SiteList.Site, case when Count(Sitevalues.Site) = 0 then 'NA' else cast(count(Sitevalues.site) as varchar(10)) end as SitesMeetingThreshold
FROM (SELECT site, value
      FROM TableName) SiteList
LEFT JOIN TableName SiteValues
 on SiteList.Site = SiteValues.Site
 and SiteValues.Value > 10
 and SiteValues.Value = SiteList.value
GROUP BY SiteList.Site

答案 1 :(得分:0)

另一种解决方案是使用条件聚合,如下所示:

SELECT site, SUM(IIf(value > 10, 1, 0)) AS value
FROM mytable
GROUP BY site

这种方法应该比自联接表更有效,因为它只需要扫描一次表。

SUM(IIf ...)是一种方便的构造,用于计算满足给定条件的记录数。

注意:在同一列中返回两种不同的数据类型(在您的用例中,是数字或字符串'NA')通常不是一个好主意。大多数RDBMS不允许这样做。因此,我提供了一个查询,当没有匹配项时将返回0,而不是NA。如果您确实想要'NA',可以尝试:

IIF(
    SUM(IIf(value > 10, 1, 0)) = 0, 
    'NA', 
    STR(SUM(IIf(value > 10, 1, 0)))
) AS value

demo on DB Fiddle ,其中包含您的示例数据:

site       | value
:--------- | ----:
Detroit    |     2
Houston    |     0
Pittsburgh |     3

答案 2 :(得分:0)

您可以像这样使用UNION

SELECT site, count(value) AS counter
FROM sites
WHERE value > 10
GROUP BY site
UNION
SELECT s.site, 'NA' AS counter
FROM sites AS s
WHERE value <= 10
AND NOT EXISTS (
  SELECT 1 FROM sites WHERE site = s.site AND value > 10  
)
GROUP BY site

结果:

site        counter
Detroit     2
Houston     NA
Pittsburgh  3

无需将整数计数器转换为Text,因为 Access 会为您隐式执行此操作。

答案 3 :(得分:0)

只需使用条件聚合:

select site,
       max(iif(value > 10, 1, 0)) as cnt_11plus
from t
group by site;

我认为0N/A好。但是,如果需要,则需要将结果转换为字符串。

select site,
       iif(max(iif(value > 10, 1, 0)) > 0,
           str(max(iif(value > 10, 1, 0))),
           "N/A"
          ) as cnt_11plus
from t
group by site;