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

Откуда:
Сообщений: 17
Всем привет. Помогите написать функцию:
Multi-statement функция, выдающая список наиболее часто встречающихся слов, соответствующих некоторым номерам в таблице.
Для простоты восприятия и ожидаемого результата таблица:

1----яблоко
2----банан
3----стол
2----лампа
4----окно
1----яблоко
2----банан

Ответ должен быть такой:
1-----яблоко
2-----банан
3-----стол
4-----окно
28 фев 17, 01:58    [20249265]     Ответить | Цитировать Сообщить модератору
 Re: Multi-statement функция  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
И снова здравствуйте: 19856989

Сообщение было отредактировано: 28 фев 17, 02:24
28 фев 17, 02:03    [20249268]     Ответить | Цитировать Сообщить модератору
 Re: Multi-statement функция  [new]
Alex767
Member

Откуда:
Сообщений: 17
Гавриленко Сергей Алексеевич, как это относится к теме?
28 фев 17, 15:24    [20251218]     Ответить | Цитировать Сообщить модератору
 Re: Multi-statement функция  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Alex767
Гавриленко Сергей Алексеевич, как это относится к теме?
Вопрос "что у вас не получается" относится к теме напрямую.
28 фев 17, 15:34    [20251251]     Ответить | Цитировать Сообщить модератору
 Re: Multi-statement функция  [new]
Владислав Колосов
Member

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

правила публикации собщений здесь: https://www.sql.ru/forum/rules.aspx
28 фев 17, 18:00    [20251891]     Ответить | Цитировать Сообщить модератору
 Re: Multi-statement функция  [new]
iiyama
Member

Откуда:
Сообщений: 642
Alex767,
Оно?
create table #T(id int identity(1,1) primary key,i int, name varchar(50))
insert into #T(i,name) values(1,'apple'),(2,'bannana'),(3,'table'),(2,'lamp'),(4,'window'), (1, 'apple'),(2,'bannana')

select i, name
from
	(
	select  
		DENSE_RANK() over(partition by i order by count(name) desc) rang
		, i, name 
	from #T
	group by i, name
	)T
where rang=1

drop table #T
28 фев 17, 20:02    [20252225]     Ответить | Цитировать Сообщить модератору
 Re: Multi-statement функция  [new]
Alex767
Member

Откуда:
Сообщений: 17
Гавриленко Сергей Алексеевич, в первом посте я привел аналог моего задания. Таблица с данными уже задана.
Само же задание звучит так: написать multi-statement функцию, которая выдает список наиболее популярных регионов для каждой страны.
Я написал следующее:
CREATE FUNCTION Функция_c()
RETURNS @Popular_region TABLE (country VARCHAR(50), region VARCHAR(50))
AS
BEGIN
INSERT INTO @Popular_region
WITH data AS( 
SELECT Тур.Страна, COUNT(Тур.Регион) as kolvo 
FROM Тур 
GROUP BY Тур.Страна 
), res as(
SELECT * FROM data WHERE kolvo = (SELECT max(kolvo) as mval from data)
)
SELECT Тур.Страна, Тур.Регион
FROM Тур
RETURN
END


То есть, если входные данные из таблицы такие:
Страна---------------Регион
Россия---------------Кострома
Франция-------------Париж
Россия---------------Кострома
Россия---------------Москва
Норвегия------------Осло
Россия---------------Кострома

То выходные данные должны быть такие:
Россия---------------Кострома
Франция-------------Париж
Норвегия------------Осло

В моем коде я пытаюсь с помощью СТЕ реализовать данное задание, но не получается.
Вот что у меня не получается.
Как это исправить? Не обязательно использовать СТЕ.
1 мар 17, 17:55    [20255072]     Ответить | Цитировать Сообщить модератору
 Re: Multi-statement функция  [new]
Alex767
Member

Откуда:
Сообщений: 17
iiyama, не совсем то...Посмотрите, пожалуйста, я описал задание более конкретно.
1 мар 17, 17:56    [20255077]     Ответить | Цитировать Сообщить модератору
 Re: Multi-statement функция  [new]
MacaronicTragedy
Member

Откуда:
Сообщений: 99
у тебя в первом CTE группировка разве не постране и региону должна быть?
сейчас получается, что ты просто считаешь количество регионов в стране
1 мар 17, 18:02    [20255096]     Ответить | Цитировать Сообщить модератору
 Re: Multi-statement функция  [new]
Alex767
Member

Откуда:
Сообщений: 17
MacaronicTragedy, от этого легче не стало =)
1 мар 17, 18:09    [20255124]     Ответить | Цитировать Сообщить модератору
 Re: Multi-statement функция  [new]
invm
Member

Откуда: Москва
Сообщений: 9913
Alex767
Как это исправить?
Прекратить выдумывать свой собственный синтаксис. Внимательно прочитать сообщение об ошибке, затем в документации изучить синтаксис CTE.
1 мар 17, 18:12    [20255130]     Ответить | Цитировать Сообщить модератору
 Re: Multi-statement функция  [new]
Alex767
Member

Откуда:
Сообщений: 17
invm, если бы я знал как это исправить, я бы не писал сюда. Спасибо за ответ.
1 мар 17, 18:18    [20255153]     Ответить | Цитировать Сообщить модератору
 Re: Multi-statement функция  [new]
iiyama
Member

Откуда:
Сообщений: 642
Alex767,
1. MacaronicTragedy правильно заметил что Ваш запрос решает не ту задачу
2. Владислав Колосов правильно заметил, что было бы неплохо привести как минимум скрипты создания таблиц, наполнить их данными и показать что нежно получить. Поскольку этого нет, я придумаю свою модель, а Вы тогда подгоняйте
3. invm и Гавриленко Сергей Алексеевич Вам абсолютно правильно подсказали направление движения, но почему-то вы их игнорируете, что очень прискорбно

PS. Надеюсь помог, хоть сегодня и не пятница

declare @Tours table(id int primary key, Country nvarchar(20), CountryRegion nvarchar(20), TourName nvarchar(255))
declare @TourTrip table(id int identity(1,1) primary key, tour_id int not null, date_start date, date_end date, cost money, pay money);

insert into @Tours values
	(1, N'Россия', N'Краснодарский край', N'Покатушки в горах')
	,(2, N'Россия', N'Краснодарский край', N'Покупаться и отлежаться')
	,(3, N'Россия', N'Краснодарский край', N'Отличный теннис')
	,(4, N'Россия', N'Краснодарский край', N'Формула 1')
	,(5, N'Россия', N'Москва', N'VIII Международная мультидисциплинарная научно-практическая конференция «EurasiaScience»')
	,(6, N'Россия', N'Москва', N'III Всероссийский конкурс на лучший научно-практический проект «Гений XXI века»')
	,(7, N'Турция', N'Кемер', N'Отель Плаза 5*')
	,(8, N'Турция', N'Анталия', N'Отель Голдфингер 4*')
	,(9, N'Египет', N'Хургада', N'Отель Hilton 5*')
	,(10, N'Россия', N'Питер', N'КультурМультур')
	,(11, N'Россия', N'Питер', N'Чемпионат по Q-ZAR')
	,(12, N'Египет', N'Шарм', N'Отель Hilton 5*')
	,(13, N'Египет', N'Каир', N'Отель Hilton 5*')
	,(14, N'Египет', N'Александрия', N'Отель Hilton 5*')

insert into @TourTrip(tour_id, date_start, date_end, cost, pay) values
	(1, '20170101', '20170112', 100000, 100000)
	,(1, '20170101', '20170110', 95000, 95000)
	,(1, '20170102', '20170115', 50000, 50000)
	,(1, '20170105', '20170106', 30000, 30000)
	,(2, '20170601', '20170620', 100000, NULL)
	,(5, '20170601', '20170620', 100000, NULL)
	,(5, '20170601', '20170620', 100000, NULL)
	,(5, '20170601', '20170620', 100000, NULL)
	,(5, '20170601', '20170620', 100000, NULL)
	,(5, '20170601', '20170620', 100000, NULL)
	,(5, '20170601', '20170620', 100000, NULL)
	,(5, '20170601', '20170620', 100000, NULL)
	,(7, '20170701', '20170620', 150000, NULL)
	,(8, '20170701', '20170621', 160000, NULL)
	,(10, '20170301', '20170302', 10000, NULL)
	,(11, '20170301', '20170310', 20000, NULL)
	,(11, '20170301', '20170310', 20000, NULL)
	,(11, '20170301', '20170310', 20000, NULL)

declare @top int =2 

select * 
from 
(
select T.Country, T.CountryRegion, count(TT.id) as cnt, DENSE_RANK() Over(partition by T.Country order by count(*) DESC) Rang 
from @Tours T
	left join @TourTrip TT ON T.id=TT.tour_id
group by T.Country, T.CountryRegion 
)SQ
where Rang<=@top
order by Country, Rang, CountryRegion
1 мар 17, 18:58    [20255292]     Ответить | Цитировать Сообщить модератору
 Re: Multi-statement функция  [new]
Alex767
Member

Откуда:
Сообщений: 17
iiyama, спасибо за развернутый ответ!
Разбираю ваш запрос. В моей таблице Регион и Страна находятся в одной таблице Тур с первичным ключом ID_тура.
Пока что получил такое, но что-то не так:
CREATE FUNCTION Функция_c()
RETURNS @Popular_region TABLE (country VARCHAR(50), region VARCHAR(50))
AS
BEGIN
DECLARE insert into @Popular_region
SELECT Тур.Страна, Тур.Регион 
FROM 
(
SELECT Тур.Страна, Тур.Регион, COUNT(Тур.Регион) AS cnt, DENSE_RANK() Over(partition BY Тур.Страна ORDER BY COUNT(*) DESC) Rang 
FROM Тур
GROUP BY Тур.Страна, Тур.Регион 
)SQ
WHERE Rang<=@top
ORDER BY Страна, Тур.Регион, Rang 
RETURN
END
1 мар 17, 19:48    [20255418]     Ответить | Цитировать Сообщить модератору
 Re: Multi-statement функция  [new]
Alex767
Member

Откуда:
Сообщений: 17
iiyama, спасибо! все получилось!
1 мар 17, 20:25    [20255494]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить