Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 хранимые процедуры на sql server management  [new]
s_kseniy
Member

Откуда:
Сообщений: 13
Просьба подсказать, как выполнить процедуру. Т.е какие действия проделать.
Задание: есть журнал посещения (клиент, дата посещения, обслуживающий мастер), нужно у каждого клиента взять три последние посещения и если мастер один и тот же(3 раза), то вывести этого клиента и "Любимого мастера".

Предполагаю: сгруппировать по клиентам, по дате. Проверять по строке до следующего клиента, как другой клиент, брать 3 предыдущие записи - проверять у них Мастера. И если один - то выводить.

Вот такое дело) Возможно осуществить таким способом? Или подскажите альтернативу?

Прикладываю картинку, для зрительного восприятия задания.

К сообщению приложен файл. Размер - 105Kb
18 дек 13, 19:59    [15313703]     Ответить | Цитировать Сообщить модератору
 Re: хранимые процедуры на sql server management  [new]
row_number() over()
Guest
s_kseniy,

для такого анализа отлично подойдут оконные функции.
http://msdn.microsoft.com/ru-ru/library/ms186734.aspx
18 дек 13, 20:14    [15313744]     Ответить | Цитировать Сообщить модератору
 Re: хранимые процедуры на sql server management  [new]
s_kseniy
Member

Откуда:
Сообщений: 13
row_number() over(),
use salon_k;
--SET ANSI_NULLS ON
--GO
--SET QUOTED_IDENTIFIER ON
--GO

--CREATE PROCEDURE zapr
--AS
--BEGIN
go
--	with tabl as
--(
 select
  KartaKlienta.FIO, Posechenie.DateZapisi, Mastera.Familya,
  row_number() over (partition by KartaKlienta.FIO order by Posechenie.DateZapisi desc) as rn
 from
  KartaKlienta INNER JOIN
                      Posechenie ON KartaKlienta.id_klienta = Posechenie.id_klienta INNER JOIN
                      UslMast ON Posechenie.id_usl_mast = UslMast.id_usl_mast INNER JOIN
                      Mastera ON UslMast.id_mast = Mastera.id_mastera 
--)                      
--select KartaKlienta.FIO, min(Mastera.Familya) as [любимый мастер]
--from  tabl
--where rn <= 3 
--group by  KartaKlienta.FIO
--having  count(*) = 3 and count(distinct Mastera.Familya) = 1;
--END
GO

Попробовала так. Но работает только открытая часть, если убрать комментарии - "Не удалось привязать составной идентификатор" столбиков из 2 селекта.Может быть не правильно задала?
19 дек 13, 05:37    [15314887]     Ответить | Цитировать Сообщить модератору
 Re: хранимые процедуры на sql server management  [new]
sdet
Member

Откуда:
Сообщений: 463
s_kseniy,
А так
select FIO,Familya from
  (select KartaKlienta.FIO FIO, Posechenie.DateZapisi DateZapisi, Mastera.Familya Familya,
  dense_rank over (partition by KartaKlienta.FIO,Mastera.Familya order by Posechenie.DateZapisi desc) as rnk
 from
  KartaKlienta INNER JOIN
                      Posechenie ON KartaKlienta.id_klienta = Posechenie.id_klienta INNER JOIN
                      UslMast ON Posechenie.id_usl_mast = UslMast.id_usl_mast INNER JOIN
                      Mastera ON UslMast.id_mast = Mastera.id_mastera ) as t
 where rnk=3
19 дек 13, 11:46    [15316306]     Ответить | Цитировать Сообщить модератору
 Re: хранимые процедуры на sql server management  [new]
s_kseniy
Member

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

Нет.

К сообщению приложен файл. Размер - 95Kb
19 дек 13, 13:08    [15317057]     Ответить | Цитировать Сообщить модератору
 Re: хранимые процедуры на sql server management  [new]
sdet
Member

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

dense_rank() over
19 дек 13, 13:19    [15317154]     Ответить | Цитировать Сообщить модератору
 Re: хранимые процедуры на sql server management  [new]
s_kseniy
Member

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

Ооо) Спасибо) Выводит) Только клиента, ктр ходил к 2м мастерам по 3 раза, выводит дважды. Не подскажите в чем ошибка?
19 дек 13, 13:27    [15317218]     Ответить | Цитировать Сообщить модератору
 Re: хранимые процедуры на sql server management  [new]
sdet
Member

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

Покажите, что получается и что хотите получить
19 дек 13, 13:39    [15317317]     Ответить | Цитировать Сообщить модератору
 Re: хранимые процедуры на sql server management  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 34025
Блог
s_kseniy
нужно у каждого клиента взять три последние посещения и если мастер один и тот же(3 раза), то вывести этого клиента и "Любимого мастера"


s_kseniy
Только клиента, ктр ходил к 2м мастерам по 3 раза, выводит дважды. Не подскажите в чем ошибка?


Не вижу противоречия.
Вообще, все плохо, курсовую не сдадите: где нормализация-то?
19 дек 13, 14:52    [15317965]     Ответить | Цитировать Сообщить модератору
 Re: хранимые процедуры на sql server management  [new]
s_kseniy
Member

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

вот так. А нужно, чтобы клиент один раз выводился

К сообщению приложен файл. Размер - 21Kb
19 дек 13, 15:14    [15318204]     Ответить | Цитировать Сообщить модератору
 Re: хранимые процедуры на sql server management  [new]
s_kseniy
Member

Откуда:
Сообщений: 13
Критик,

про все плохо это вопрос или констатация факта? И про нормализацию не слышала, не поясните?
19 дек 13, 15:16    [15318217]     Ответить | Цитировать Сообщить модератору
 Re: хранимые процедуры на sql server management  [new]
sdet
Member

Откуда:
Сообщений: 463
s_kseniy
sdet,

вот так. А нужно, чтобы клиент один раз выводился

Тогда первоначальный вар
with tabl as
(
select
KartaKlienta.FIO FIO, Posechenie.DateZapisi DateZapisi, Mastera.Familya Familya,
row_number() over (partition by KartaKlienta.FIO order by Posechenie.DateZapisi desc) as rn
from
KartaKlienta INNER JOIN
Posechenie ON KartaKlienta.id_klienta = Posechenie.id_klienta INNER JOIN
UslMast ON Posechenie.id_usl_mast = UslMast.id_usl_mast INNER JOIN
Mastera ON UslMast.id_mast = Mastera.id_mastera
)

select FIO,Familya from tbl t
where rn<=3
group by FIO,Familya
having count(*)=3
19 дек 13, 15:24    [15318292]     Ответить | Цитировать Сообщить модератору
 Re: хранимые процедуры на sql server management  [new]
s_kseniy
Member

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

Даа) Неужели)) Спасибо!!! Я чуть не чокнулась(( А тут, 2 строчки изменились. Еще раз спасибо!!!
19 дек 13, 15:47    [15318485]     Ответить | Цитировать Сообщить модератору
 Re: хранимые процедуры на sql server management  [new]
s_kseniy
Member

Откуда:
Сообщений: 13
sdet, Извините, у меня возможно глупый вопрос) А можно этот запрос записать процедурой? Просто добавить Begin-End не выходит. Достаточно одного слова))) Можно или нет
19 дек 13, 16:29    [15318807]     Ответить | Цитировать Сообщить модератору
 Re: хранимые процедуры на sql server management  [new]
wizli
Member

Откуда: Minsk
Сообщений: 270
s_kseniy
sdet, Извините, у меня возможно глупый вопрос) А можно этот запрос записать процедурой? Просто добавить Begin-End не выходит. Достаточно одного слова))) Можно или нет

Да можно. Create procedure
19 дек 13, 16:35    [15318858]     Ответить | Цитировать Сообщить модератору
 Re: хранимые процедуры на sql server management  [new]
sdet
Member

Откуда:
Сообщений: 463
s_kseniy
sdet, Извините, у меня возможно глупый вопрос) А можно этот запрос записать процедурой? Просто добавить Begin-End не выходит. Достаточно одного слова))) Можно или нет

Конечно можно. Только поставьте ; перед with(;with tabl as)
19 дек 13, 16:38    [15318893]     Ответить | Цитировать Сообщить модератору
 Re: хранимые процедуры на sql server management  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2396
s_kseniy
Критик,

про все плохо это вопрос или констатация факта? И про нормализацию не слышала, не поясните?

и в гугле забанили?

http://support.microsoft.com/kb/283878

http://ru.wikipedia.org/wiki/??????????_?????
19 дек 13, 17:15    [15319200]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить