Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.059 c
2-1163600738
Tru
2006-11-15 17:25
2006.12.03
Базы данных


15-1163750958
Slider007
2006-11-17 11:09
2006.12.03
С днем рождения ! 17 ноября


2-1163416043
TrainerOfDolphins
2006-11-13 14:07
2006.12.03
Отмена действия


9-1138364742
Зм1й
2006-01-27 15:25
2006.12.03
Скелетная анимация :(


15-1163582327
xazan
2006-11-15 12:18
2006.12.03
Определение топологии сети





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский