Наверное JOIN
От: csharpworker  
Дата: 08.05.09 06:15
Оценка:
Здраствуйте!
В SQL не силен.
Есть запрос, который возвращает два столбца (ID, Summa) на определенную дату.
Мне надо сравнить значение Summa на несколько дат для всех ID. Т.е. получить столбцы типа:
(ID, Summa_Date1, Summa_Date2, Summa_Date3)

Запрос имеет много вложений и очень сложный, я предполагаю что можно требуемый результат получить выполнив 3 раза уже готовый запрос с разными датами и сделать JOIN.
Подскажите конструкцию JOIN.
Спасибо!
Re: Наверное JOIN
От: csharpworker  
Дата: 08.05.09 06:17
Оценка:
Забыл сказать — для некоторых дат не выберутся некоторые ID. Т.е. при объединении в тех столбцах ноль должен быть.
Re[2]: Наверное JOIN
От: sunsquirel США  
Дата: 08.05.09 06:47
Оценка: 2 (1)
Здравствуйте, csharpworker, Вы писали:

C>Забыл сказать — для некоторых дат не выберутся некоторые ID. Т.е. при объединении в тех столбцах ноль должен быть.


Вообще не видя точных условий обработки трудно выбрать наиболее оптимальный по скорости запрос.

Вариант 1. Вам нужно будет дважды сделать внешнее соединение таблицы с самой собой.
Будет выглядить примерно так:

SELECT t1.ID,
t1.Summa_Date1,
t2.Summa_Date2,
t3.Summa_Date3
FROM
Table as t1
LEFT OUTER JOIN Table as t2 on (t1.ID = t2.ID)
LEFT OUTER JOIN Table as t3 on (t1.ID = t3.ID)
WHERE
<ваши условия по обработке>

Вариант 2. Так как у вас суммы, вы можете просто воспользоваться union и суммированием.
Будет выглядить примерно так:

SELECT z.ID,
SUM(z.Summa_Date1),
SUM(z.Summa_Date2),
SUM(z.Summa_Date3)
FROM
(
SELECT t1.ID as ID,
t1.Summa_Date1 as Summa_Date1,
0 as Summa_Date2,
0 as Summa_Date3
FROM Table t1
WHERE <ваши условия обработки>
UNION ALL
SELECT t2.ID as ID,
0 as Summa_Date1,
t2.Summa_Date2 as Summa_Date2,
0 as Summa_Date3
FROM Table t2
WHERE <ваши условия обработки>
UNION ALL
SELECT t3.ID as ID,
0 as Summa_Date1,
0 as Summa_Date2,
t3.Summa_Date3 as Summa_Date3
FROM Table t3
WHERE <ваши условия обработки>
) as Z
GROUP BY z.ID

Я бы рекомендовала второй вариант, так он более быстрый обычно.
Re: Наверное JOIN
От: niteshade123  
Дата: 08.05.09 07:26
Оценка:
Здравствуйте, csharpworker, Вы писали:
C>Здраствуйте!
для форсу бандитского СУБД укажите?
нужны именно три даты по ID или их кол-во произвольно меняется?
Re[2]: Наверное JOIN
От: csharpworker  
Дата: 08.05.09 07:51
Оценка:
Здравствуйте, niteshade123, Вы писали:

N>Здравствуйте, csharpworker, Вы писали:

C>>Здраствуйте!
N>для форсу бандитского СУБД укажите?
N>нужны именно три даты по ID или их кол-во произвольно меняется?

Это MS SQL, но ежели честно, то задача приплыла из ненавистной 1С, где джоины пишутся по русски. Посему абстрактная постановка задачи.
Re[3]: Наверное JOIN
От: niteshade123  
Дата: 08.05.09 09:00
Оценка:
Здравствуйте, csharpworker, Вы писали:

C>Это MS SQL, но ежели честно, то задача приплыла из ненавистной 1С, где джоины пишутся по русски. Посему абстрактная постановка задачи.

MS SQL какой?
информацию из Вас не вытянешь...
задачу точнее опишите в терминах "что есть" и "что надо", с примером исходных и желаемых данных
иначе на свой страх и риск пользуйтесь пред. советом
Re[4]: Наверное JOIN
От: csharpworker  
Дата: 08.05.09 13:41
Оценка:
Здравствуйте, niteshade123, Вы писали:

N>Здравствуйте, csharpworker, Вы писали:


C>>Это MS SQL, но ежели честно, то задача приплыла из ненавистной 1С, где джоины пишутся по русски. Посему абстрактная постановка задачи.

N>MS SQL какой?
N>информацию из Вас не вытянешь...
N>задачу точнее опишите в терминах "что есть" и "что надо", с примером исходных и желаемых данных
N>иначе на свой страх и риск пользуйтесь пред. советом

Значица:
есть MS SQL 2005 и 1С 8.1.

Есть в 1С отчет — который по сути возвращает Клиента и сумму задолжености на определенную дату.
Мне надо получить Клиента и 3 суммы на разные даты.

Не хочу вникать в запрос — там 3 листа "восьмым" шрифтом на А4.
Поэтому я думаю взять этот запрос типа
"ВЫБРАТЬ Клиента, Задолженность ИЗ... ГДЕ.... Дата=&Дата"
и выполнить этот запрос 3 раза за разные даты и получить какоето объединение запросов.

ИМХО — версия СУБД в данном случае не важна, ибо запрос пишется на платформе 1С, где даже человеский SELECT пишут ВЫБРАТЬ ))))

Буду благодарен на советы.
Re[5]: Наверное JOIN
От: niteshade123  
Дата: 12.05.09 03:55
Оценка:
Здравствуйте, csharpworker, Вы писали:

C>Значица:

C>есть MS SQL 2005 и 1С 8.1.

C>Не хочу вникать в запрос — там 3 листа "восьмым" шрифтом на А4.

C>Поэтому я думаю взять этот запрос типа
C>"ВЫБРАТЬ Клиента, Задолженность ИЗ... ГДЕ.... Дата=&Дата"
C>и выполнить этот запрос 3 раза за разные даты и получить какоето объединение запросов.
если одному ID на дату соответствует не более одной Summa, то псевдокодом:
select t.id,
       max(case t."ПолеСДатой" when "ВашаДата" then t.summa else null end) sum_dt,
       max(case t."ПолеСДатой" when "ВашаДата2" then t.summa else null end) sum_dt2,
       max(case t."ПолеСДатой" when "ВашаДата3" then t.summa else null end) sum_dt3
from "ВашаТаблица" t
where t."ПолеСДатой" in ("ВашаДата", "ВашаДата2", "ВашаДата3")
      and <прочие условия>
group by t.id



C>ИМХО — версия СУБД в данном случае не важна, ибо запрос пишется на платформе 1С, где даже человеский SELECT пишут ВЫБРАТЬ ))))

в этом случае, вероятно, Вы ошиблись конференцией)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.