оператор CASE в запросе SQL

IvanLis
Дата: 02.11.2009 12:08:07
Помогите составить запрос

нужно сделать выборку из таблицы
в зависимости от Proverki_DolProv необходимо разделить на то или иное число
если кол-во используемых операторов IIF небольшое, то все нормально
если кол-во увеличить, то выдает ошибку "Слишком сложное выражение в выражении запроса"
SELECT Dol_Prover, Proverki_DolProv, KolvoProv,
IIf([Proverki_DolProv]=3,Round([KolvoProv]/23,2),
IIf([Proverki_DolProv]=4,Round([KolvoProv]/17,2),
IIf([Proverki_DolProv]=5,Round([KolvoProv]/49,2),
IIf([Proverki_DolProv]=6,Round([KolvoProv]/88,2),
IIf([Proverki_DolProv]=7,Round([KolvoProv]/72,2),
IIf([Proverki_DolProv]=8,Round([KolvoProv]/141,2),
[KolvoProv])))))) AS Sr  
FROM SQL1
ORDER BY Proverki_DolProv;

думаю сделать через CASE
SELECT Dol_Prover, Proverki_DolProv, KolvoProv,
CASE [Proverki_DolProv]
	WHEN [Proverki_DolProv]=3 THEN Round([KolvoProv]/23,2)
	WHEN [Proverki_DolProv]=4 THEN Round([KolvoProv]/17,2)
	WHEN [Proverki_DolProv]=5 THEN Round([KolvoProv]/49,2)
	WHEN [Proverki_DolProv]=6 THEN Round([KolvoProv]/88,2)
	WHEN [Proverki_DolProv]=7 THEN Round([KolvoProv]/72,2)
	WHEN [Proverki_DolProv]=8 THEN Round([KolvoProv]/141,2)
	ELSE [KolvoProv]
END	AS Sr  
FROM SQL1
ORDER BY Proverki_DolProv;

искал по Internet, сделал по примеру
но выдает ошибку "...пропущен оператор..."

Подскажите как сделать???
Модератор: Прошу прощения, поменял форматирование, чтобы было проще читать.
Владимир Саныч
Дата: 02.11.2009 12:17:01
Проще всего завести таблицу:

3 23
4 17
5 49
6 88
7 72
8 141

И использовать ее в запросе. И заодно, если изменятся эти цифры, то не придется править программу.
IvanLis
Дата: 02.11.2009 12:27:07
Владимир Саныч
Проще всего завести таблицу:...
И использовать ее в запросе. И заодно, если изменятся эти цифры, то не придется править программу.


1. эти цифры берутся с формы, это здесь я прописал их в запросе, чтобы было понятно
цифры меняются, при формировании запроса. не хотелось бы заводить еще одну таблицу
Но если не получится....
2. а как использовать вторую таблицу
qwrqwr
Дата: 02.11.2009 12:34:44
IvanLis

SELECT Dol_Prover, Proverki_DolProv, KolvoProv,
IIf([Proverki_DolProv]=3,Round([KolvoProv]/23,2),
IIf([Proverki_DolProv]=4,Round([KolvoProv]/17,2),
IIf([Proverki_DolProv]=5,Round([KolvoProv]/49,2),
IIf([Proverki_DolProv]=6,Round([KolvoProv]/88,2),
IIf([Proverki_DolProv]=7,Round([KolvoProv]/72,2),
IIf([Proverki_DolProv]=8,Round([KolvoProv]/141,2),
[KolvoProv])))))) AS Sr  
FROM SQL1
ORDER BY Proverki_DolProv;
Это можно чуток подсократить и уйти от вложенных IIF-ов за счет Choose:
SELECT Dol_Prover, Proverki_DolProv, KolvoProv, 
        Choose(Proverki_DolProv,
                      KolvoProv,
                      KolvoProv,
          Round(KolvoProv/23,2),
          Round(KolvoProv/17,2),
          Round(KolvoProv/49,2),
          Round(KolvoProv/88,2),
          Round(KolvoProv/72,2),
          Round(KolvoProv/141,2)) AS Sr 
FROM SQL1
ORDER BY Proverki_DolProv;
Но это не панацея - если вариантов Proverki_DolProv действительно много - то +1 к мнению ВС
отакота
Дата: 02.11.2009 12:36:05
IvanLis
а как использовать вторую таблицу

например
SELECT Dol_Prover, Proverki_DolProv, KolvoProv, T2.Поле2 AS Sr
FROM SQL1 INNER JOIN T2 ON SQL1.[Proverki_DolProv]=T2.Поле1
ORDER BY Proverki_DolProv
отакота
Дата: 02.11.2009 12:37:59
точнее
например
SELECT Dol_Prover, Proverki_DolProv, KolvoProv, Round(KolvoProv/T2.Поле2,2) AS Sr
FROM SQL1 INNER JOIN T2 ON SQL1.[Proverki_DolProv]=T2.Поле1
ORDER BY Proverki_DolProv
qwrqwr
Дата: 02.11.2009 12:44:13
отакота
точнее
например
SELECT Dol_Prover, Proverki_DolProv, KolvoProv, Round(KolvoProv/T2.Поле2,2) AS Sr
FROM SQL1 INNER JOIN T2 ON SQL1.[Proverki_DolProv]=T2.Поле1
ORDER BY Proverki_DolProv

тогда уж
SELECT Dol_Prover, Proverki_DolProv, KolvoProv, 
       Round(KolvoProv/Nz(T2.Поле2,1),2) AS Sr
FROM SQL1 LEFT JOIN T2 ON SQL1.Proverki_DolProv=T2.Поле1
ORDER BY Proverki_DolProv
отакота
Дата: 02.11.2009 12:52:24
qwrqwr
отакота
точнее
например
SELECT Dol_Prover, Proverki_DolProv, KolvoProv, Round(KolvoProv/T2.Поле2,2) AS Sr
FROM SQL1 INNER JOIN T2 ON SQL1.[Proverki_DolProv]=T2.Поле1
ORDER BY Proverki_DolProv

тогда уж
SELECT Dol_Prover, Proverki_DolProv, KolvoProv, 
       Round(KolvoProv/Nz(T2.Поле2,1),2) AS Sr
FROM SQL1 LEFT JOIN T2 ON SQL1.Proverki_DolProv=T2.Поле1
ORDER BY Proverki_DolProv
Да, согласен, так будет правильнее для логики приведенной в исходном CASE.
IvanLis
Дата: 02.11.2009 13:12:24
Вот чем мне нравится этот форум....
Оперативностью, объективностью, грамотностью, краткостью!

я так понял, что Choose будет работать если у меня значения последовательно идут
короче .... не вижу жесткой привязки значения знаменателя и Proverki_DolProv....
т.е. возможны косяки

от оператора CASE все отказались.... не понятна причина
сам редко работаю с SQL, в других языках достаточно распространен

попробую сделать с таблицей, о результатах отпишусь
IvanLis
Дата: 02.11.2009 14:06:51
IvanLis
попробую сделать с таблицей, о результатах отпишусь


Пришлось добавить таблицы
Значение знаменателя подцепил еще при формировании SQL1
остальное работает нормально

спасибо всем!