Форум: "Начинающим";
Текущий архив: 2006.12.03;
Скачать: [xml.tar.bz2];
ВнизСложный SQL запрос к БД Найти похожие ветки
← →
Kostafey © (2006-11-14 23:47) [0]Уважаеыме мастера прошу помощи в следующем. Вопрос скорее по SQL нежели по Delphi. Разрабатываю приложение, которое посылает SQL-заросы к SQL Server. Нужно построить такой запрос чтобы выводились значения сначала по одному ограничению, затем по другому и выводилось бы это в одну таблицу. Т.е. если бы это можно разбить на 2 запроса то выглядело бы это так:
select field1 as first
from table1
where field1=a
select field1 as second
from table1
where field1=b
но в этом получатся 2 набора данных а это выводится должно в одну сетку dbGrid, т.е. например:
first second
a b
a b
a b
количество записей обоих запросов одинаково (гарантировано)
Использовать union нельзя т.к. значения a и b должны выводиться друг на против друга.
Как так сделать ???
Я уж думал сделать 2 сетки и выводить в них, правда нужно будет как-то синхронизировать навигацию, да и вообще это решение будет сильно притянуто за уши.
← →
MikePetrichenko © (2006-11-14 23:53) [1]union уже отменили?
← →
Kostafey © (2006-11-14 23:57) [2]> union уже отменили
select field1 as first
from table1
where field1=a
union
select field1 as second
from table1
where field1=b
получиться
first
a
a
a
b
b
b
а нужно
first second
a b
a b
a b
я же вроде уже упоминал об этом
← →
MikePetrichenko © (2006-11-15 00:02) [3]В зависимости от сервера:
1. Хранимые процедуры.
2. select (select), (select) from table
3. left outer join
4. структуру таблиц дай. можно что-то и придумать...
← →
Johnmen © (2006-11-15 00:09) [4]Думается, что ни 1, ни 2, ни 3 не помогут, не зависимо от сервера.
Если это MSSQL, то через временную таблицу.
← →
Kostafey © (2006-11-15 00:09) [5]Вот первая половина запроса:
Select PCH.PCH_NAME,
count(ZVK1.PCH_COD) as Kol,
count(ZVK1.PCH_COD)*100.0/
(Select count(*) from ZVK1, PCH
where (ZVK1.DATE_ZVK1 between: "2006.06.1"
and: "2006.06.12") and (PCH.PCH_COD=ZVK1.PCH_COD)) as Acount,
/* as Kol2,*/
count(ZVK1.PCH_COD)*100.0/
(Select count(*) from ZVK1, PCH
where (ZVK1.DATE_ZVK1 between: "2006.05.1"
and: "2006.05.12") and (PCH.PCH_COD=ZVK1.PCH_COD)) as Acount2
From PCH, ZVK1
where (ZVK1.DATE_ZVK1 between: "2006.06.1" and: "2006.06.12")
and (PCH.PCH_COD*=ZVK1.PCH_COD)
group by PCH.PCH_NAME
union
Select "Итого :",
count(PCH.PCH_COD) as Kol,
(count(PCH.PCH_COD)*100.0/
(Select count(*) from ZVK1, PCH
where (ZVK1.DATE_ZVK1 between: "2006.06.1" and: "2006.06.12")
and (PCH.PCH_COD=ZVK1.PCH_COD))) as Acount,
/*"Kol2",*/
"123"
From PCH, ZVK1
where (ZVK1.DATE_ZVK1 between: "2006.06.1" and: "2006.06.12")
and (PCH.PCH_COD=ZVK1.PCH_COD)
order by PCH.PCH_NAME
← →
Kostafey © (2006-11-15 00:12) [6]Структура таблиц (только интересующие поля):
таблица ZVK1:
ZVK1.PCH_COD
ZVK1.DATE_ZVK1
таблица PCH:
PCH.PCH_COD
PCH_NAME
ZVK1.PCH_COD связана с PCH.PCH_COD
← →
MikePetrichenko © (2006-11-15 00:14) [7]Т. е. у тебя во второй части запроса считается ИТОГО по строкам? Верно?
Тогда почему бы его не добавить в сам запрос?
← →
MikePetrichenko © (2006-11-15 00:17) [8]Ну хоть чуть описания добавь. Что за таблицы, что посчитать нужно. Может запрос с нуля нужно писать, а раблирать логигу твоих ну совсем не светит.
← →
Kostafey © (2006-11-15 00:20) [9]> Т. е. у тебя во второй части запроса считается ИТОГО по
> строкам? Верно?
> Тогда почему бы его не добавить в сам запрос?
Вообще-то это собственно к моему вопросу отношения не имеет.
То что я привел - это готовая исправно работающая часть запроса.
луще я вот так скажу:
у меня получилось:
ПЧ Выезд1 Выезд2
1 2 ?
2 1 ?
3 3 ?
итого 6 ?
Где стоят вопросы в этом и сложность
← →
MikePetrichenko © (2006-11-15 00:24) [10]
> Вообще-то это собственно к моему вопросу отношения не имеет.
Есть у меня таблицы:
table_1
name
num
table_2
name_2
num_2
num_5
Зочу считать среднюю температуру по больгице. Помогите написать запрос?
← →
Kostafey © (2006-11-15 00:25) [11]> Ну хоть чуть описания добавь. Что за таблицы, что посчитать
> нужно. Может запрос с нуля нужно писать, а раблирать логигу
> твоих ну совсем не светит.
Нужно считать суммы выездов каждой из чвастей за определеный промежуток времени.
Т.е. группировка по части числа выездов, и общий итог количества выездов всех частей, затем то же самое, но за аналогичный период прошлого года.
← →
Kostafey © (2006-11-15 00:30) [12]> Зочу считать среднюю температуру по больгице. Помогите написать
> запрос?
Понял, постараюсь объяснить.
таблица ZVK1 содержит перечень выездов (дата выезда и код части)
таблица PCH содержит код и название части
Сгруппировав запрос ко коду частей получим количество выездов каждой части
← →
MikePetrichenko © (2006-11-15 00:31) [13]
> Нужно считать суммы выездов каждой из чвастей за определеный
> промежуток времени.
> Т.е. группировка по части числа выездов, и общий итог количества
> выездов всех частей, затем то же самое, но за аналогичный
> период прошлого года.
Ну дак а в чем проблема?
← →
Kostafey © (2006-11-15 00:34) [14]> Зочу считать среднюю температуру по больгице. Помогите написать
> запрос?
Понял, исправляюсь.
таблица ZVK1:
ZVK1.PCH_COD
ZVK1.DATE_ZVK1
содержит данные о выездах частей (дата выезда и код части)
таблица PCH:
PCH.PCH_COD
PCH_NAME
содержит код и название части
сгруппировав звпрос по коду частей получим количество выездов каждой части за определенный промежуток времени
← →
MikePetrichenko © (2006-11-15 00:36) [15]
> Понял, исправляюсь.
Вот. Теперь понятно :)
Будем думать...
← →
MikePetrichenko © (2006-11-15 00:45) [16]Поправь под твой сервер сам:
select a.PCH_COD,
a.PCH_NAME,
(select count(b.PCH_COD)
from ZVK1 b
where (b.PCH_COD = a.PCH_COD) and
(b.DATE_ZVK1 between "01.01.2006" and "31.01.2006")),
(select count(c.PCH_COD)
from ZVK1 c
where (c.PCH_COD = a.PCH_COD) and
(c.DATE_ZVK1 between "01.01.2005" and "31.01.2005"))
from PCH a;
← →
Kostafey © (2006-11-15 00:46) [17]
> Ну дак а в чем проблема?
проблема в том, что условие выбора даты может быть записано только во внешнем зпросе (в подзапросе такое не реализовать).
А нужно как бы два диапазона дат и два набора абсолтно одинаковых полей, но подобранные по разному критерию даты
← →
MikePetrichenko © (2006-11-15 00:50) [18]
> Kostafey © (15.11.06 00:46) [17]
указанный в [16] будет работать.
Только есть пизать в Query, то естественно назвать параметры для диапазонов по разному.
← →
Kostafey © (2006-11-15 00:52) [19]
> MikePetrichenko © (15.11.06 00:45) [16]
> Поправь под твой сервер сам:...
ВАУ !!! Работает !!! Вот спасибо ! Попробую тепрь разобраться во всем этом...
← →
Kostafey © (2006-11-15 00:55) [20]> Только есть пизать в Query, то естественно назвать параметры
> для диапазонов по разному.
Ну да, конечно.
Надо же работает, я думал и нельзя так сделать !
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.12.03;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.05 c