Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.03;
Скачать: CL | DM;

Вниз

Сложный 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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.068 c
2-1163573400
Alex_C
2006-11-15 09:50
2006.12.03
Положение текста в мемо


2-1163580289
Делфи
2006-11-15 11:44
2006.12.03
плейлист


15-1163507570
Юрий Зотов
2006-11-14 15:32
2006.12.03
Прошу помочь :о)


2-1163394280
Lebedev
2006-11-13 08:04
2006.12.03
Можно ли регулировать положение текста (caption) TPanel?


2-1163438458
Troan_81
2006-11-13 20:20
2006.12.03
Работа с директориями