我正在尝试在Access中编写一个查询,该查询将为表中值超过指定级别的每个站点返回值的计数,但是,对于没有值超过该级别的站点,则返回一个指定的值值,例如"NA"
。
我尝试了Iif
,Switch
,Union
子查询,查询了另一个查询,但是没有运气。我可以获取所有超过该级别的计数,或者所有"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 |
+-----------------+-------+
答案 0 :(得分: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;
我认为0
比N/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;