SQL IIF组在MS Access 2007中的结果

时间:2011-02-12 08:07:31

标签: sql ms-access ms-access-2007

我正在使用一些我认为应该工作的SQL。但是,我正在快速了解MS Access是否有自己的如何使用SQL的想法。

SELECT count([system_info].[id]) as CountofID,
IIF(Left([system_info].[CSMemory],Len([system_info].[CSMemory])-3)  < 512000, "<512mb", 
IIF(Left([system_info].[CSMemory],Len([system_info].[CSMemory])-3)  < 1000000, "512mb - 1GB", "nope")) as MemoryText
FROM system_info
GROUP BY MemoryText;

因此上面的代码给出了错误消息“您试图执行不包含指定表达式XXX作为聚合函数的一部分的查询”。

我用Google搜索了一下,但我仍然陷入困境。如果我删除了计数和groupBY,查询将会运行,我会看到我为“MemoryText”创建的标签列表。

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

如果我删除了count和groupBY,查询将会运行,我会看到我为“MemoryText”创建的标签列表。

在这种情况下,请保存用作qryBase的版本:

SELECT [system_info].[id]),
IIF(Left([system_info].[CSMemory],Len([system_info].[CSMemory])-3)  < 512000, "<512mb", 
IIF(Left([system_info].[CSMemory],Len([system_info].[CSMemory])-3)  < 1000000, "512mb - 1GB", "nope")) as MemoryText
FROM system_info;

然后您的汇总查询可以是:

SELECT MemoryText, count(id) as CountofID
FROM qryBase
GROUP BY MemoryText;

修改:但是,这个表达让我感到困惑:

Left([system_info].[CSMemory],Len([system_info].[CSMemory])-3)  < 512000

而不是512000,我原本期望524288(512 * 1024)。

Left()的输出将是String,因此您的表达式将字符串与数字进行比较。虽然数据库引擎可能会在比较之前将字符串转换为数字,但我会明确地这样做。

Val(Left([system_info].[CSMemory],Len([system_info].[CSMemory])-3)) < 524288

如果您告诉我们CSMemory字段的数据类型并向我们展示一些示例值,您可能会得到更好的建议。

Edit2 :来自Access'帮助: Val函数停止在第一个无法识别的字符处读取字符串。

所以Val(“2052644 KB”)将忽略非数字字符,并为您提供数字2052644.但是,您的样本值也包含逗号,因此Val()将停止读取第一个逗号... Val( “2,052,644 KB”)会给你2。

如果您的查询是在Access 2000或更高版本的Access会话中运行的,则可以使用Replace()函数去除逗号(用零长度字符串替换逗号),然后使用Val()计算文本。在立即窗口中:

? Replace("2,052,644 KB", ",", "")
2052644 KB

? Val(Replace("2,052,644 KB", ",", ""))
 2052644 

因此,您可以使用:

而不是使用Left()和Len()
Val(Replace(CSMemory, ",", ""))  < 512000

答案 1 :(得分:1)

您需要将整个Memory Text表达式放在GROUP BY语句

SELECT count([system_info].[id]) as CountofID,
IIF(Left([system_info].[CSMemory],Len([system_info].[CSMemory])-3)  < 512000, "<512mb", 
IIF(Left([system_info].[CSMemory],Len([system_info].[CSMemory])-3)  < 1000000, "512mb - 1GB", "nope")) as MemoryText
FROM system_info
GROUP BY IIF(Left([system_info].[CSMemory],Len([system_info].[CSMemory])-3)  < 512000,
"<512mb", 
IIF(Left([system_info].[CSMemory],Len([system_info].[CSMemory])-3)  < 1000000, "512mb - 1GB", "nope"))