我正在使用一些我认为应该工作的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”创建的标签列表。
感谢您的帮助。
答案 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"))