Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];

Вниз

Paradox: Select id, (select sum( ...   Найти похожие ветки 

 
Sandman25   (2003-10-16 17:18) [0]

Доброе время суток.

Пытаюсь в SQL Explorer выполнить запрос вида
select id,
count(*),
(select ... from table where id = another.id)
from another, third, ...
...
group by id


Если вложенный запрос возвращает ровно одну запись, то в результате в последнем поле всегда получаю пустоту (Null)... даже с запросом select count(*).
Если вложенный запрос возвращает больше одной записи, то совершенно правильно ругается "Single row subquery produced more than one row."
Paradox такие селекты поддерживает вообще?
Если не поддерживает, то почему не ругается Capability not supported?
Если поддерживает, то как добиться, чтобы возвращал не Null?
Я в LocalSQL пошастал, но там SELECT очень скудно описывается, вложенные select даже не упоминаются.
Спасибо.


 
Reindeer Moss Eater   (2003-10-16 17:21) [1]

В SQL есть существенная разница между Count(*) и Count(имя_поля)


 
SasaR   (2003-10-16 17:24) [2]

Какая ? (если н использовать group by....)


 
MsGuns   (2003-10-16 17:24) [3]

В данном случае, ИМХО, лучше использовать связки (JOIN). Но для полной ясности не плохо было б поподробнее описать задачу


 
MsGuns   (2003-10-16 17:26) [4]

>Paradox такие селекты поддерживает вообще?

Парадокс-то тут причем ? Другое дело BDE..

>Я в LocalSQL пошастал, но там SELECT очень скудно описывается, вложенные select даже не упоминаются.
Упоминаться-то упоминаются, но скудно, что верно, то верно..


 
Sandman25   (2003-10-16 17:27) [5]

Если подробно, то задача такая: получить
число заказов, число блюд и себестоимость потраченных продуктов в разрезе чего-нибудь (например, в разрезе официантов, блюд или дат).
Получаем такой select:

select zakaz_dish.dish_id,
count(distinct zakaz.id),
sum(zakaz_dish.portion_amount),
sum(zakaz_dish.amount*zakaz_dish.price),
(select sum(zakaz_comp.amount*zakaz_comp.stoim)
from zakaz_comp
where zakaz_comp.zakaz_dish_id=zakaz_dish.id
)
from zakaz,
zakaz_dish
where zakaz.id=zakaz_dish.zakaz_id
group by dish_id


 
Sandman25   (2003-10-16 17:50) [6]

Видимо, не получится.
select id, count(*),
(select sum(zakaz_comp.amount*zakaz_comp.stoim)
from zakaz_comp
where zakaz_comp.zakaz_dish_id=zakaz_dish.id
)
from zakaz_dish
where ZAKAZ_DISH.ID=8
group by ZAKAZ_DISH.id

Возвращает 8,1,Null

select id, count(*),
(select sum(zakaz_comp.amount*zakaz_comp.stoim)
from zakaz_comp
where zakaz_comp.zakaz_dish_id=8
)
from zakaz_dish
where ZAKAZ_DISH.ID=8
group by ZAKAZ_DISH.id

Возвращает 8,1,7.

Видимо, придется делать вычисляемое поле и в OnCalculateField запускать отдельный Query с подзапросом :(


 
Johnmen   (2003-10-16 17:59) [7]

>Sandman25 ©

Что получится ? Если

select id, count(*),
(select sum(zakaz_comp.amount*zakaz_comp.stoim)
from zakaz_comp
where (zakaz_comp.zakaz_dish_id=zakaz_dish.id)
or (zakaz_comp.zakaz_dish_id=8)
)
from zakaz_dish
where ZAKAZ_DISH.ID=8
group by ZAKAZ_DISH.id


И вот так

select id, count(*),
(select sum(zakaz_comp.amount*zakaz_comp.stoim)
from zakaz_comp
where (zakaz_comp.zakaz_dish_id=zakaz_dish.id)
or (zakaz_dish.id=8)
)
from zakaz_dish
where ZAKAZ_DISH.ID=8
group by ZAKAZ_DISH.id


 
Sandman25   (2003-10-16 18:02) [8]

[7] Johnmen © (16.10.03 17:59)

8,1,7
8,1,Null


 
Sandman25   (2003-10-16 18:07) [9]

(select sum(zakaz_comp.amount*zakaz_comp.stoim)
from zakaz_comp
where zakaz_dish.id is null
)
from zakaz_dish
where ZAKAZ_DISH.ID=8
group by ZAKAZ_DISH.id

Возвращает 8,1,15.60
Такое ощущение, что при выполнении подзапроса все остальные таблицы считаются "обнуленными". У меня же zakaz_dish_id не может быть null в принципе: во-первых, стоит флажок required, а во-вторых, я всю таблицу из 8 строк скоро наизусть запомню - ну нету там нулов, нету :(


 
ЮЮ   (2003-10-17 07:04) [10]

Да бросьте вы, Парадох, к счастью, не поддерживает такие подзапросы

SELECT ID, q1.Cnt1, q2.Sum2
FROM
table
LEFT JOIN "q1.sql" q1 ON table1.id = q1.id
LEFT JOIN "q2.sql" q2 ON table1.id = q2.id

где в тексте агрегирующих запросов qX
должен заранее динамически сформированы условия отбора (т.е. тот самый "разрез", т.к. в этих запросах не поддерживаются параметры)


 
Sandman25   (2003-10-17 10:08) [11]

[10] ЮЮ © (17.10.03 07:04)

Насколько я понял, Paradox не поддерживает Left Join, во всяком случае, так показали мои вчерашние опыты. У меня запросы формируются динамически, с кучей фильтров, поэтому заранее заготовить все "view" не очень хочется.

Я нашел другой выход - агрегатное значение себестоимости блюда записываю в таблицу связи блюда-заказа, а не рассчитываю по потраченным продуктам для отчета, как раньше. Поэтому теперь вложенный запрос не нужен :)

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



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.034 c
3-41013
denmin
2003-10-14 11:02
2003.11.13
Как настроить клиента для MS SQL 2000?


14-42120
otido
2003-10-21 10:56
2003.11.13
странные глюки с локалкой, помогите плиз...


4-42285
Max_
2003-09-11 11:00
2003.11.13
Использование Ram? (Memory usage)


3-40975
Tumcoat
2003-10-16 04:39
2003.11.13
Удаление временных dbf-файлов


1-41175
Popova
2003-11-02 17:22
2003.11.13
Как обойти эту проблему





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский