Cформировать SQL запрос

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Al Prad
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 16.08.2007 (Чт) 12:46
Откуда: Одесса

Cформировать SQL запрос

Сообщение Al Prad » 20.03.2008 (Чт) 14:18

Добрый день!
Помогите, плиз, составить SQL-запрос.

В базе данных есть поля: a, b, c, d, e

В зависимости от переменной а надо вычислить в каждой записи:

если а="Вася", то var1 = a*b
если а="Петя", то var2 = a*c
если а="Зина" или "Кондолиза" , то var3 = a*d

и по всей базе вычислить sum(var1)/sum(e); sum(var2)/sum(e); sum(var3)/sum(e)

Спасибо.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Сообщение iGrok » 20.03.2008 (Чт) 16:04

А в чем трудность?
К примеру, var'ы получить подзапросами вроде:
select (a * d) as var3 from table where a = 'Зина' or a = 'Кондолиза'

А дальше запросом просуммировать поля...
label:
cli
jmp label

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 20.03.2008 (Чт) 16:09

Лучше использовать не OR, а IN.
Lasciate ogni speranza, voi ch'entrate.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Сообщение iGrok » 20.03.2008 (Чт) 16:20

Да, пожалуй )
label:
cli
jmp label

Al Prad
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 16.08.2007 (Чт) 12:46
Откуда: Одесса

Сообщение Al Prad » 20.03.2008 (Чт) 18:03

Мешает то, что я уже натолкнулся на то, что не могу заставить работать подзапросы в vb6 вот здесь http://bbs.vbstreets.ru/viewtopic.php?p ... 99545052ab

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Сообщение iGrok » 20.03.2008 (Чт) 19:00

Ок. Тогда не подзапросом.

Код: Выделить всё
SELECT SUM(a*b)/SUM(e) as var1, 0 as var2, 0 as var3 FROM table WHERE a = 'Вася'
UNION
SELECT 0 as var1, SUM(a*c)/SUM(e) as var2, 0 as var3 FROM table WHERE a = 'Петя'
UNION
SELECT 0 as var1, 0 as var2, SUM(a*d)/SUM(e) as var3 FROM table WHERE a IN ('Зина','Кондолиза')
label:
cli
jmp label

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Сообщение HandKot » 21.03.2008 (Пт) 8:51

В базе данных есть поля: a, b, c, d, e

В зависимости от переменной а надо вычислить в каждой записи:

если а="Вася", то var1 = a*b
если а="Петя", то var2 = a*c
если а="Зина" или "Кондолиза" , то var3 = a*d

и по всей базе вычислить sum(var1)/sum(e); sum(var2)/sum(e); sum(var3)/sum(e)



Код: Выделить всё
select
  sum(case when a in ('Вася') then a*b else 0 end)/ sum(e) as var1,
  sum(case when a in ('Петя') then a*c else 0 end)/ sum(e) as var2,
  sum(case when a in ('Зина', 'Кондолиза') then a*d else 0 end)/ sum(e) as var3
from
  table



PS: вопрос в следующем, если у Вас поле "а" текстовое (либо 'Вася', либо 'Петя' и т.д), то как Вы собираетесь его умножать a*b ?
I Have Nine Lives You Have One Only
THINK!

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Сообщение iGrok » 21.03.2008 (Пт) 9:44

Хм.. Это даже получше будет, т.к. у меня лишних нулей много получается )

Вот только Ado скорей всего пошлет на case when...
Т.е. будет:
sum(iif(a in ('Вася'), a * b, 0) / sum(e) as var1 ...

Правда не на 100% уверен в срабатывании конструкции
iif( a in (...
label:
cli
jmp label

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 21.03.2008 (Пт) 10:02

Если пошлет, то не ADO, а конкретный провайдер.
Приведенный синтаксис будет работать для MSSQL. Для Access надо заменить на iif.
Lasciate ogni speranza, voi ch'entrate.

Al Prad
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 16.08.2007 (Чт) 12:46
Откуда: Одесса

Сообщение Al Prad » 21.03.2008 (Пт) 13:41

HandKot писал(а):PS: вопрос в следующем, если у Вас поле "а" текстовое (либо 'Вася', либо 'Петя' и т.д), то как Вы собираетесь его умножать a*b ?


Очепфятка. Конечно, буду перемножать числовые поля.
Коды запросов еще не пробовал - загружен на других объектах :?

Al Prad
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 16.08.2007 (Чт) 12:46
Откуда: Одесса

Сообщение Al Prad » 21.03.2008 (Пт) 16:50

Пробую варианты. Проверку текстового поля заменил на числовое, чтобы не нарваться на грабли с кавычками, апострофами, двойными кавычками для переменной типа string. И имена полей, извините. приведу реальные.

1 вариант:
sSQL = "SELECT "
sSQL = sSQL & " sum(iif( S1>0 then PeredanoNaProizv*S1, 0 ))/ sum(PeredanoNaProizv) as var1 "
sSQL = sSQL & " FROM LabDataSun"

2 вариант
sSQL = "SELECT "
sSQL = sSQL & " sum(case when S1>0 then PeredanoNaProizv * S1 else 0 end ))/ sum(PeredanoNaProizv) as var1 "
sSQL = sSQL & " FROM LabDataSun"

Оба варианта дают run-time error '3075': syntax error (missing operator) in query expression 'sum... и т.д.'

Al Prad
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 16.08.2007 (Чт) 12:46
Откуда: Одесса

Сообщение Al Prad » 21.03.2008 (Пт) 17:53

iGrok писал(а):Ок. Тогда не подзапросом.

Код: Выделить всё
SELECT SUM(a*b)/SUM(e) as var1, 0 as var2, 0 as var3 FROM table WHERE a = 'Вася'
UNION
SELECT 0 as var1, SUM(a*c)/SUM(e) as var2, 0 as var3 FROM table WHERE a = 'Петя'
UNION
SELECT 0 as var1, 0 as var2, SUM(a*d)/SUM(e) as var3 FROM table WHERE a IN ('Зина','Кондолиза')


Такая конструкция ошибки не выдает, но и правильно не работает. Последний select вычисляет var3, но обнуляет var1 и var2 :cry:

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Сообщение iGrok » 21.03.2008 (Пт) 18:17

Чего??? Куда обнуляет?

У тебя по этому запросу должна выдаваться таблица в 3 строки и 3 столбца, где значения будут по диагонали.
label:
cli
jmp label

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Сообщение HandKot » 24.03.2008 (Пн) 8:59

1 вариант:
sSQL = "SELECT "
sSQL = sSQL & " sum(iif( S1>0 then PeredanoNaProizv*S1, 0 ))/ sum(PeredanoNaProizv) as var1 "
sSQL = sSQL & " FROM LabDataSun"


1 вариант:
Код: Выделить всё
sSQL = "SELECT "
sSQL = sSQL & " sum(iif( S1>0, PeredanoNaProizv*S1, 0 ))/ sum(PeredanoNaProizv) as var1 "
sSQL = sSQL & " FROM LabDataSun"


а так?
I Have Nine Lives You Have One Only
THINK!

Al Prad
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 16.08.2007 (Чт) 12:46
Откуда: Одесса

Сообщение Al Prad » 24.03.2008 (Пн) 10:15

iGrok писал(а):Чего??? Куда обнуляет?

У тебя по этому запросу должна выдаваться таблица в 3 строки и 3 столбца, где значения будут по диагонали.

А, пардон. Это я посмотрел только в последнюю строку.

Al Prad
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 16.08.2007 (Чт) 12:46
Откуда: Одесса

Сообщение Al Prad » 24.03.2008 (Пн) 10:28

HandKot писал(а):
1 вариант:
sSQL = "SELECT "
sSQL = sSQL & " sum(iif( S1>0 then PeredanoNaProizv*S1, 0 ))/ sum(PeredanoNaProizv) as var1 "
sSQL = sSQL & " FROM LabDataSun"


1 вариант:
Код: Выделить всё
sSQL = "SELECT "
sSQL = sSQL & " sum(iif( S1>0, PeredanoNaProizv*S1, 0 ))/ sum(PeredanoNaProizv) as var1 "
sSQL = sSQL & " FROM LabDataSun"


а так?


Ёпрст! Как туда затесалась эта then?!

Всё работает, большое всем спасибо!
:D


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 214

    TopList  
cron