Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 прошу помочь - сложный запрос  [new]
Solo.dmitry
Member

Откуда:
Сообщений: 12
Доброго времени суток!

версия сервера
Microsoft SQL Server code name "Katmai" (CTP) - 10.0.1075.23 (Intel X86) Nov 8 2007 14:16:26 Copyright (c) 1988-2007 Microsoft Corporation Developer Edition on Windows NT 6.0 <X86>
(Build 6001: Service Pack 1)


приложение - сайт на aspx, коннект к базе по TCP/IP с учеткой "только на чтение".

суть такова - достать кол-во заданий, находящихся в определенных состояниях на определенную дату для определенного человека.

это я сделать сумел и упрощенный запрос назвал "запрос Б"

Внимание, вопрос - как одним запросом без использования временных таблиц вытащить результаты запроса Б для каждой из дат из запроса А.

Привожу упрощенные данные и запросы - в них я заменил свои count() на SUM() как более наглядный для этих данных.

Чувствую, что решение несложное, но я, наверное, уже загнался :).

Спасибо за внимание.

if OBJECT_ID ('sdo_temp','U') is not null drop table [sdo_temp]

create table sdo_temp(
id int,
dat datetime)

insert into sdo_temp values(1,'20091201')	-- sum = 1
insert into sdo_temp values(2,'20091202')	-- sum= 2
insert into sdo_temp values(3,'20091203')	-- sum = 18
insert into sdo_temp values(4,'20091204')	-- 
insert into sdo_temp values(5,'20091205')
insert into sdo_temp values(6,'20091204')
insert into sdo_temp values(7,'20091203')
insert into sdo_temp values(8,'20091203')
insert into sdo_temp values(0,'20091202')

-------------------- запрос А -  нашел как реализовать диапазон дат
DECLARE @FromDate SMALLDATETIME, @ToDate SMALLDATETIME;
SELECT @FromDate = '20091201', @ToDate = '20091205';
WITH Days(D) AS
(
 SELECT @FromDate WHERE @FromDate <= @ToDate
 UNION ALL
 SELECT DATEADD(DAY,1,D) FROM Days WHERE D < @ToDate
)

select D from Days

--------------------- запрос Б - умею доставать для одной даты
declare @MyDat datetime;
select @Mydat='20091202'

	 
	select Datg, COUNT (*) as Total, SUM(allw.id) as Summa
		from (
			select *, @MyDat as Datg
			from sdo_temp 
			where sdo_temp.dat =@MyDat
		) as allw	
	group by Datg
2 дек 09, 19:30    [8010657]     Ответить | Цитировать Сообщить модератору
 Re: прошу помочь - сложный запрос  [new]
aleks2
Guest
Может я опять чего недопонял... но могет быть так сойдет?

select Dat as Datg, COUNT (*) as Total, SUM(id) as Summa
from 
sdo_temp 
where @FromDate <= Dat AND Dat<@ToDate
group by Dat
2 дек 09, 19:48    [8010701]     Ответить | Цитировать Сообщить модератору
 Re: прошу помочь - сложный запрос  [new]
ura
Member [заблокирован]

Откуда: Киев
Сообщений: 932
Ну если это сложный запрос... тогда я уж и не знаю...

declare @sdo_temp table(
id int,
dat datetime)

insert into @sdo_temp values(1,'20091201')	-- sum = 1
insert into @sdo_temp values(2,'20091202')	-- sum= 2
insert into @sdo_temp values(3,'20091203')	-- sum = 18
insert into @sdo_temp values(4,'20091204')	-- 
insert into @sdo_temp values(5,'20091205')
insert into @sdo_temp values(6,'20091204')
insert into @sdo_temp values(7,'20091203')
insert into @sdo_temp values(8,'20091203')
insert into @sdo_temp values(0,'20091202')

-------------------- запрос А -  нашел как реализовать диапазон дат
DECLARE @FromDate SMALLDATETIME, @ToDate SMALLDATETIME;
SELECT @FromDate = '20091201', @ToDate = '20091205';
WITH Days(D) AS
(
 SELECT @FromDate WHERE @FromDate <= @ToDate
 UNION ALL
 SELECT DATEADD(DAY,1,D) FROM Days WHERE D < @ToDate
)
select d.D, SUM(t.id)
from Days d left join @sdo_temp t on d.D=t.dat
group by d.D
2 дек 09, 19:57    [8010717]     Ответить | Цитировать Сообщить модератору
 Re: прошу помочь - сложный запрос  [new]
Solo.dmitry
Member

Откуда:
Сообщений: 12
ura,

эдак я пробовал, тогда ругается:

автор
Invalid object name 'Days'.


на строку

select d.D, SUM(t.id)

aleks2, ваш вариант работает, но это не совсем то что нужно..
дело в том, что в настоящий запрос Б весьма большой и дата там участвует как параметр в выражениях типа
.....
		 join performing on (
[performing].[InstanceID]=[main].[InstanceID]
                   and [performing].[StartDate] < @Mydat
		and ( [performing].[EndDate] is null     
		OR [performing].[EndDate] >= @Mydat
		 )
....

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


я немножко программист и с моей линейной точки зрения задача сводится к типу
Mydat=date(2008,12,1);
for (int i=0;i<5;++i){
     Mydat = Mydat+ 1;
     вернуть результат запроса для Mydat;
}

но сердце не лежит выполнять один и тоже запрос 5 раз - чувствую что можно сделать правильнее и красивее.
2 дек 09, 20:52    [8010868]     Ответить | Цитировать Сообщить модератору
 Re: прошу помочь - сложный запрос  [new]
iljy
Member

Откуда:
Сообщений: 8711
Solo.dmitry,

рассмотрите вариант с использованием cross apply. Если значений действительно 5 - будет достаточно быстро. Иначе придется оптимизировать, но уж весь запрос целиком
2 дек 09, 21:26    [8010944]     Ответить | Цитировать Сообщить модератору
 Re: прошу помочь - сложный запрос  [new]
ura
Member [заблокирован]

Откуда: Киев
Сообщений: 932
Solo.dmitry
ura,

эдак я пробовал, тогда ругается:
автор
Invalid object name 'Days'.


что значит ругается ? если полностью мой запрос скопировать ???
если да, тогда в твоем CTP Katmai проблема, поставь нормальный сервак
2 дек 09, 23:54    [8011335]     Ответить | Цитировать Сообщить модератору
 Re: прошу помочь - сложный запрос  [new]
Solo.dmitry
Member

Откуда:
Сообщений: 12
ura,

прошу прощения за невнимательность!

Вы правы, я не полностью копировал ваш вариант ответа - из-за чего и получал ошибки в ситнаксисе.

я попросту не ожидал что переменная может быть таблицей, думал что времянку всегда создают с помощью
create table - а это права доступа.

как я уже говорил, исходный запрос Б большой и возвращает он от 0 до 200 примерно строк. работает у меня несколько секунд, но на целевом серваке вполне шустро. (там, кстати, я забыл уточнить, - используется sql 2005).

думаю сделать так
declare @sdo_temp table(

dat datetime,
c1 int,
c2 int,
...
cN int
)

DECLARE @FromDate SMALLDATETIME, @ToDate SMALLDATETIME;
SELECT @FromDate = '20091201', @ToDate = '20091205';

while ( @FromDate <= @ToDate)

          insert into @sdo_temp select ЗАПРОС Б
          dateadd(DAY,1,@FromDate)

select * from @sdo_temp

синтаксис, ясно дело, условный.
------------------------------------------------
iljy , спасибо за вариант, но он налагает необходимость в дополнительных правах на create function - так что я могу им воспользоваться только из вспомогательной БД куда у аккаунта исполнения есть доступ. В таком случае, если я не ошибаюсь, придется разрешать на сервере cross-database reference или как-она-там-называется.
3 дек 09, 07:26    [8011700]     Ответить | Цитировать Сообщить модератору
 Re: прошу помочь - сложный запрос  [new]
aleks2
Guest
Solo.dmitry
aleks2, ваш вариант работает, но это не совсем то что нужно..
дело в том, что в настоящий запрос Б весьма большой и дата там участвует как параметр в выражениях типа
.....
		 join performing on (
[performing].[InstanceID]=[main].[InstanceID]
                   and [performing].[StartDate] < @Mydat
		and ( [performing].[EndDate] is null     
		OR [performing].[EndDate] >= @Mydat
		 )
....

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


Нельзя быть "немножко беременной" => программист вы никакой.

Чем парить мозги "что в настоящий запрос Б весьма большой" - приведите запрос.
Вам сделают маленький.
3 дек 09, 08:31    [8011785]     Ответить | Цитировать Сообщить модератору
 Re: прошу помочь - сложный запрос  [new]
Solo.dmitry
Member

Откуда:
Сообщений: 12
aleks2,

Вы правы, в программиста я всего лишь играю а на сцене SQL я играю еще отвратительнее чем обычно.


Как и всякий никакой программист, я полагал, что для рассмотрения сути задачи вполне достаточно представления объектов в упрощенном виде, типа "кирпичиков", не вдаваясь в технические особенности добычи глины - но, видимо, ошибался или показал непонятные кирпичи.

Вы простите меня.

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

Я не прошу оптимизировать мой большой запрос, и не прошу уменьшить или упростить его.

Попробую еще раз сформулировать задачу -

"запрос 1" (возвращает таблицу с данными. В ней НЕТ даты из исходных таблиц, но можно прицепить к возврату @Mydat отдельным столбцом)

"запрос 2" считает агрегацию нескольких столбцов из этого запроса 1.

задача - вернуть одним набором строк результат некоего запроса 2, исполненного отдельно для каждой даты из внешнего набора дат, ориентировочно в наборе последовательность из пяти дней.

Может я опять чего недопонял. Может быть я неправ и можно получить результат и не запуская запроса в цикле. Так это ж будет Победа! Так вы объясните мне, aleks2, как, например, записать Ваш вариант для такого "кирпичика". Он возвращает просто набор строк, соответствующий "запросу 1" - т.е. потом еще надо будет выполнить агрегацию.

-- изображу так:
select 
[main].[Name],
[performing].[StartDate]
from [main]

join performing on (
[performing].[InstanceID]=[main].[InstanceID]    -- отбираем действующие задания:
                   and [performing].[StartDate] < @Mydat  -- те что стартованы на момент @Mydat
   		   and ( [performing].[EndDate] is null           -- те что не были закончены на момент @Mydat
		          OR [performing].[EndDate] >= @Mydat
                          )
		 )
3 дек 09, 09:36    [8011922]     Ответить | Цитировать Сообщить модератору
 Re: прошу помочь - сложный запрос  [new]
aleks2
Guest
Solo.dmitry
aleks2,
Я не хочу приводить исходный запрос, потому что мне придется обезличивать в нем все имена таблиц и полей, приводить структуры таблиц и индексов - а это, имхо, в этой задаче лишнее и уводит от темы.

У вас там поля матерно обозваны?

Solo.dmitry
aleks2,
Попробую еще раз сформулировать задачу -

"запрос 1" (возвращает таблицу с данными. В ней НЕТ даты из исходных таблиц, но можно прицепить к возврату @Mydat отдельным столбцом)

"запрос 2" считает агрегацию нескольких столбцов из этого запроса 1.

задача - вернуть одним набором строк результат некоего запроса 2, исполненного отдельно для каждой даты из внешнего набора дат, ориентировочно в наборе последовательность из пяти дней.


Формулировка сферического коня в вакууме.

Пример аггрегации из вашего запроса
select MIN([Name]), [StartDate]
FROM
(
--------------------------
select 
[main].[Name],
[performing].[StartDate]
from [main]

join performing on (
[performing].[InstanceID]=[main].[InstanceID]    -- отбираем действующие задания:
                   and [performing].[StartDate] < @Mydat  -- те что стартованы на момент @Mydat
   		   and ( [performing].[EndDate] is null           -- те что не были закончены на момент @Mydat
		          OR [performing].[EndDate] >= @Mydat
                          )
		 )
---------------------
) X
GROUP BY [StartDate]
3 дек 09, 09:50    [8011972]     Ответить | Цитировать Сообщить модератору
 Re: прошу помочь - сложный запрос  [new]
Solo.dmitry
Member

Откуда:
Сообщений: 12
aleks2,

а где в Вашем примере @Mydat проходит по диапазону дат согласно условиям задачи?
3 дек 09, 09:56    [8011992]     Ответить | Цитировать Сообщить модератору
 Re: прошу помочь - сложный запрос  [new]
iljy
Member

Откуда:
Сообщений: 8711
Solo.dmitry

iljy , спасибо за вариант, но он налагает необходимость в дополнительных правах на create function - так что я могу им воспользоваться только из вспомогательной БД куда у аккаунта исполнения есть доступ. В таком случае, если я не ошибаюсь, придется разрешать на сервере cross-database reference или как-она-там-называется.

:-o это каким же образом???? Вы описание APPLY смотрели?
SELECT @FromDate = '20091201', @ToDate = '20091205';

WITH Days(D) AS
(
 SELECT @FromDate WHERE @FromDate <= @ToDate
 UNION ALL
 SELECT DATEADD(DAY,1,D) FROM Days WHERE D < @ToDate
)
select * from
(
   select D from Days
) t1
    cross /*или outer*/ apply
(
	select Datg, COUNT (*) as Total, SUM(allw.id) as Summa
		from (
			select *, t1.D as Datg
			from sdo_temp 
			where sdo_temp.dat =t1.D
		) as allw	
	group by Datg
)t2
3 дек 09, 10:25    [8012167]     Ответить | Цитировать Сообщить модератору
 Re: прошу помочь - сложный запрос  [new]
Solo.dmitry
Member

Откуда:
Сообщений: 12
iljy,

CROSS APPLY в примерах встречался мне только с CREATE FUNCTION - вот оттуда я и взял что нужны доп. привилегии.

спасибо за пример, я смогу опробовать его в обед и напишу о результате.
3 дек 09, 10:31    [8012200]     Ответить | Цитировать Сообщить модератору
 Re: прошу помочь - сложный запрос  [new]
aleks2
Guest
iljy
Solo.dmitry

iljy , спасибо за вариант, но он налагает необходимость в дополнительных правах на create function - так что я могу им воспользоваться только из вспомогательной БД куда у аккаунта исполнения есть доступ. В таком случае, если я не ошибаюсь, придется разрешать на сервере cross-database reference или как-она-там-называется.

:-o это каким же образом???? Вы описание APPLY смотрели?
SELECT @FromDate = '20091201', @ToDate = '20091205';

WITH Days(D) AS
(
 SELECT @FromDate WHERE @FromDate <= @ToDate
 UNION ALL
 SELECT DATEADD(DAY,1,D) FROM Days WHERE D < @ToDate
)
select * from
(
   select D from Days
) t1
    cross /*или outer*/ apply
(
	select Datg, COUNT (*) as Total, SUM(allw.id) as Summa
		from (
			select *, t1.D as Datg
			from sdo_temp 
			where sdo_temp.dat =t1.D
		) as allw	
	group by Datg
)t2


Два "программиста" нашли друг-друга?

Или это конкурс: как получить неизвестно что... наиболее извращенным способом?


Чой-нибудь попрощее не канает? Хе-хе...
Может я опять чего недопонял... но могет быть так сойдет? Если уж надо "через задницу"...

WITH Days(D) AS
(
 SELECT @FromDate Day 
 UNION ALL
 SELECT DATEADD(DAY,1,D) Day FROM Days WHERE D < @ToDate
)
select Dat as Datg, COUNT (*) as Total, SUM(id) as Summa
from 
sdo_temp 
RIGHT OUTER JOIN
Days
where Day=Dat
group by Dat

токмо остается загадкой: в чем фишка?
3 дек 09, 11:32    [8012742]     Ответить | Цитировать Сообщить модератору
 Re: прошу помочь - сложный запрос  [new]
aleks2
Guest
Поправимся слегка

WITH Days(D) AS
(
 SELECT @FromDate D 
 UNION ALL
 SELECT DATEADD(DAY,1,D) D FROM Days WHERE D < @ToDate
)
select D.D as Datg, COUNT (s.id) as Total, SUM(s.id) as Summa
from 
sdo_temp s
RIGHT OUTER JOIN
Days D
where D.D=s.Dat
group by D.D

а то опять скажуть: не работает...
3 дек 09, 11:36    [8012791]     Ответить | Цитировать Сообщить модератору
 Re: прошу помочь - сложный запрос  [new]
Solo.dmitry
Member

Откуда:
Сообщений: 12
aleks2,

Спасибо за вариант решения.

Но видимо я неубедительно говорил о том что sdo_temp в реальной задаче есть не таблица с датами, а запрос, результаты выполнения которого зависят от поданной даты. И сложность для меня составляет объединение результатов этого запроса для каждой из даты.

проверить смогу несколько позже..
WITH Days(D) AS
(
 SELECT @FromDate D 
 UNION ALL
 SELECT DATEADD(DAY,1,D) D FROM Days WHERE D < @ToDate
)
select D.D as Datg, 
-- COUNT (s.id) as Total, 
-- SUM(s.id) as Summa
COUNT (sdo_temp_vyborka_for_date.id) as Total, 
SUM(sdo_temp_vyborka_for_date.id) as Summa

from 
sdo_temp s  -- в Вашем варианте для каждой из строк DAYS будет проверяться ВЕСЬ sdo_temp,
                  -- тогда как он должен зависеть от текущей строки из DAYS 
                 -- допустим заданий на 01.12 - нашлось 5
                 -- заданий на 02.12 - нашлось 6
                 -- заданий на 03.12 - нашлось 4
-- то есть тут моему неокрепшему в запросах умишку видится нечто вроде
-- но в том-то и беда, что во внутреннем запросе D.D оказывается неопределенным
-- впрочем, еще поколдовать над вариантами смогу чуть позже.. 
     ( select *
        from sdo_temp
        where 
                sdo_temp.Dat < D.D
     ) sdo_temp_vyborka_for_date
RIGHT OUTER JOIN
Days D
where D.D=s.Dat
group by D.D
и вот что мы хотим получить

01.12 | 5
02.12 | 6
02.12 | 4
3 дек 09, 12:02    [8013030]     Ответить | Цитировать Сообщить модератору
 Re: прошу помочь - сложный запрос  [new]
aleks2
Guest
Solo.dmitry
Но видимо я неубедительно говорил о том что sdo_temp в реальной задаче есть не таблица с датами, а запрос, результаты выполнения которого зависят от поданной даты. И ложность для меня составляет объединение результатов этого запроса для каждой из даты.


Ладно, партизаньте дальше...
По фотографии я лечить не умею.
3 дек 09, 12:09    [8013100]     Ответить | Цитировать Сообщить модератору
 Re: прошу помочь - сложный запрос  [new]
Solo.dmitry
Member

Откуда:
Сообщений: 12
iljy


SELECT @FromDate = '20091201', @ToDate = '20091205';

WITH Days(D) AS
(
 SELECT @FromDate WHERE @FromDate <= @ToDate
 UNION ALL
 SELECT DATEADD(DAY,1,D) FROM Days WHERE D < @ToDate
)
select * from
(
   select D from Days
) t1
    cross /*или outer*/ apply
(
	select Datg, COUNT (*) as Total, SUM(allw.id) as Summa
		from (
			select *, t1.D as Datg
			from sdo_temp 
			where sdo_temp.dat =t1.D
		) as allw	
	group by Datg
)t2


Победа! спасибо огромное! Задача-минимум успешно решена.

ЗЫ специально для любителей оптимизировать большие запросы привожу итог
DECLARE @FromDate SMALLDATETIME, @ToDate SMALLDATETIME;
SELECT @FromDate = '20091122', @ToDate = '20091127';

WITH Days(D) AS
(
 SELECT @FromDate WHERE @FromDate <= @ToDate
 UNION ALL
 SELECT DATEADD(DAY,1,D) FROM Days WHERE D < @ToDate
)

select * from
(
   select D from Days
) t1
    cross /*или outer*/ apply
(
	/* select Datg, COUNT (*) as Total, SUM(allw.id) as Summa 
		from (
			select *, t1.D as Datg
			from sdo_temp 
			where sdo_temp.dat =t1.D
		) as allw	
	group by Datg
)t2 */

select 
count([unioned].DynamicProsroch) as Prosroch
, count([unioned].DynamicNotRunned) as NotRunned    --RESULT      ;     неначатые	
, count([unioned].DynamicControl ) as Control     --RESULT      ;     на контроле
--,Datg

 from	-- 
	(			-- этим уровнем мы выносим на подитоги одно имя набора данных
	
	select		-- селект для объединения с журналом работы

	t1.D as Datg,

	, case when [alltasks].[ExpectedEndDate]<t1.D then 1 else null end                                   as DynamicProsroch   --просрочено ли

	, case when ([control].ControlType='---MY_CONTROL_TYPE---' and [control].[ControlDate]<t1.D) then 1 else null end        as DynamicControl   -- на контроле

	, case when journal2.ActionDate is null then 1 else null end                                           as DynamicNotRunned  -- не начатые

	  from (
		select  
		 [main].[ExpectedEndDate]         as ExpectedEndDate,
		 [performing].[TaskState]         as TaskState,
		 [performing].[IsProsroch]         as IsProsroch,	-- заремить ибо на определенный момент это еще не просрочено
		 [main].[globID]	  as globID
		 ,[main].[InstanceID] as InstanceID

		 from performer 

		 join main on ( [performer].[InstanceID]=[main].[InstanceID] and [main].[Name] is not null )
		 join as performing on (
											 [performing].[InstanceID]=[main].[InstanceID]
										 and [performing].[RealStartDate] < t1.D
										 and ( [performing].[RealEndDate] is null     
												 OR [performing].[RealEndDate] >= t1.D
												 )
																		 )
		 where 
			[performer].[PerformerID]='-------------------- PERSON ID ----------------'
		 ) as alltasks

	left join maintask on ([maintask].[InstanceID]=[alltasks].[globID])
			-- цепляем последнюю запись из журнала -  последнего события - вдруг это удаленное задание
	left join MY_JOURNAL as journal on ( 
			journal.[RowID] = ( 
					select top 1 RowID 
					from journal 
					
					where (journal.[InstanceID]=[alltasks].[InstanceID] and ActionDate<t1.D)
					order by ActionDate desc
					)
			)
			-- цепляем запись из журнала о том было ли стартовано задание на тот моент
	left join MY_JOURNAL as journal2 on ( 
			journal2.[RowID] = ( 
					select top 1 RowID 
					from journal2 
					
					where (journal2.[InstanceID]=[alltasks].[InstanceID] 
							and ActionDate<=t1.D 
							and (
								journal2.[TaskState]='-----IDSTATE_WORK---' 
								or journal2.[TaskState]='-----IDSTATE_DOWN---'	-- бывает что его попросту завершили без "-----IDSTATE_WORK---"
								) 
							) -- в работе
					order by ActionDate 
					)
			)
	left join control on ( [control].[InstanceID]=[alltasks].[globID] )
	where (
		[alltasks].TaskState!='---IDSTATE_BACK----' or (journal.Action is not null and journal.Action !='---IDACTION_BACK----' ) -- удаленные отметаем
		) 
		
	) as unioned
	group by Datg
)t2

Было бы замечательно, если бы уважаемый All предложил способ не цеплять MY_JOURNAL дважды или любые другие ценные советы относительно улучшения данного запроса.

Спасибо!
3 дек 09, 13:07    [8013659]     Ответить | Цитировать Сообщить модератору
 Re: прошу помочь - сложный запрос  [new]
ura
Member [заблокирован]

Откуда: Киев
Сообщений: 932
Solo.dmitry
iljy


SELECT @FromDate = '20091201', @ToDate = '20091205';

WITH Days(D) AS
(
 SELECT @FromDate WHERE @FromDate <= @ToDate
 UNION ALL
 SELECT DATEADD(DAY,1,D) FROM Days WHERE D < @ToDate
)
select * from
(
   select D from Days
) t1
    cross /*или outer*/ apply
(
	select Datg, COUNT (*) as Total, SUM(allw.id) as Summa
		from (
			select *, t1.D as Datg
			from sdo_temp 
			where sdo_temp.dat =t1.D
		) as allw	
	group by Datg
)t2


Победа! спасибо огромное! Задача-минимум успешно решена.



И чем это лучше моего варианта ? да и aleks2 это же имел в виду
3 дек 09, 13:26    [8013871]     Ответить | Цитировать Сообщить модератору
 Re: прошу помочь - сложный запрос  [new]
aleks2
Guest
Solo.dmitry
Победа! спасибо огромное! Задача-минимум успешно решена.


Если бы здания строились так же, как пишутся ПОДОБНЫЕ программы... то один дятел мог бы разрушить цивилизацию.
3 дек 09, 13:50    [8014085]     Ответить | Цитировать Сообщить модератору
 Re: прошу помочь - сложный запрос  [new]
Solo.dmitry
Member

Откуда:
Сообщений: 12
ura,

...
from Days d 
left join @sdo_temp t 
on d.D=t.dat

как я уже объяснял, вы собираете с датами один-и-тот-же набор записей @sdo_temp -
видимо это из-за того, что в своем вопросе я задал статические данные в sdo_temp.

На самом деле я недостаточно точно сформулировал постановку вопроса и вот теперь вынужден признать что только iljy понял что я хочу.

стартовано завершено
15.11 task1 02.12
16.11 task2 04.12
17.11 task3 04.12
18.11 task4 05.12

01.12 02.12 03.12
----------------------------------------------------------
task1
task2 task2 task2
task3 task3 task3
task4 task4task4
count()=4 count()=3
----------------------------------------------------------
3 дек 09, 13:56    [8014136]     Ответить | Цитировать Сообщить модератору
 Re: прошу помочь - сложный запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Solo.dmitry
только iljy понял что я хочу.
Вы специально так формулируете задачу, чтобы понял только каждый десятый?
3 дек 09, 14:01    [8014188]     Ответить | Цитировать Сообщить модератору
 Re: прошу помочь - сложный запрос  [new]
aleks2
Guest
Solo.dmitry
ura,

...
from Days d 
left join @sdo_temp t 
on d.D=t.dat

как я уже объяснял, вы собираете с датами один-и-тот-же набор записей @sdo_temp -
видимо это из-за того, что в своем вопросе я задал статические данные в sdo_temp.

На самом деле я недостаточно точно сформулировал постановку вопроса и вот теперь вынужден признать что только iljy понял что я хочу.

стартовано завершено
15.11 task1 02.12
16.11 task2 04.12
17.11 task3 04.12
18.11 task4 05.12

01.12 02.12 03.12
----------------------------------------------------------
task1
task2 task2 task2
task3 task3 task3
task4 task4task4
count()=4 count()=3
----------------------------------------------------------


В твоем запросе CROSS APPLY нужен как рыбе зонтик.
3 дек 09, 14:11    [8014279]     Ответить | Цитировать Сообщить модератору
 Re: прошу помочь - сложный запрос  [new]
Solo.dmitry
Member

Откуда:
Сообщений: 12
iap,

крайне извиняюсь за последний пост - неудачно нажал на кнопку и запостил недоработанное сообщение.

сейчас исправлюсь.
3 дек 09, 14:12    [8014296]     Ответить | Цитировать Сообщить модератору
 Re: прошу помочь - сложный запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Solo.dmitry
сейчас исправлюсь.
В смысле? Ещё задачку сформулируете?
3 дек 09, 14:24    [8014401]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить