SQL IIF группа по результату в MS Access 2007 - PullRequest
2 голосов
/ 12 февраля 2011

Я использую некоторый 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 как часть агрегатной функции».

Я немного погуглил и все еще застрял. Если я удаляю счетчик И groupBY, запрос будет запущен, и я вижу список меток, которые я создаю для «MemoryText».

Спасибо за любую помощь.

Ответы [ 2 ]

2 голосов
/ 12 февраля 2011

Если я удаляю счетчик И 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 КБ") будет игнорировать нецифровые символы и даст вам число 2052644. Однако ваши значения выборки также включают запятые, поэтому Val () прекратит чтение с первой запятой ... Val ( «2 052 644 КБ») даст вам 2.

Если ваш запрос выполняется в сеансе Access с Access 2000 или новее, вы можете использовать функцию Replace (), чтобы убрать запятые (заменить запятые на строки нулевой длины), прежде чем оценивать текст с помощью Val (). В ближайшем окне:

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

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

Таким образом, вместо использования Left () и Len (), вы можете использовать:

Val(Replace(CSMemory, ",", ""))  < 512000
1 голос
/ 12 февраля 2011

Вам нужно поместить все выражение памяти в выражении 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"))
...