Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как написать процедуру исходя из запроса, объединяющего несколько таблиц (join-ов)  [new]
maxaaa
Member

Откуда:
Сообщений: 3
Здравствуйте, гуру.
Учу сейчас, что ранее не доучил.
Застопорился на одном задании, ответа на которое не нашёл. Возможно, могу попросит помощи здесь? А вдруг?;)

Задание такое: составьте sp, которое получает как параметр код категории и год, и возвращает общее кол-во продаж в год.
База известная в узких кругах
use [AdventureWorksDW2012]

Пишу запрос, вроде работает гуд

SELECT DISTINCT
 --s.ProductKey, 
 dpc.ProductCategoryKey,
  --dps.ProductSubcategoryKey,
 Year(s.OrderDate) OrderDateYear,
 COUNT(dpc.ProductCategoryKey)  OVER (PARTITION BY dpc.ProductCategoryKey, Year(s.OrderDate)
                                      ORDER BY dpc.ProductCategoryKey) AS YearSales
 FROM 
 FactInternetSales s JOIN DimProduct dp
 ON s.ProductKey=dp.ProductKey
					 JOIN DimProductSubcategory dps
					 ON dp.ProductSubcategoryKey=dps.ProductSubcategoryKey
					 JOIN DimProductCategory dpc
					 ON dpc.ProductCategoryKey=dps.ProductCategoryKey


Но когда пытаюсь перекинуть это в процедуру, стопорюсь...
Начало такое:

 CREATE PROCEDURE sp_SalesByCategories
  @ProductCategoryKey INT,
  @Year INT
  AS
  DECLARE 
	@ProductKey INT,
	@ProductSubcategoryKey INT
	SELECT DISTINCT @ProductKey=s.ProductKey,
				@ProductCategoryKey=dpc.ProductCategoryKey,
				@ProductSubcategoryKey=dps.ProductSubcategoryKey,
				@Year=Year(s.OrderDate),
				@ProductCategoryKey=dpc.ProductCategoryKey,


тут, по видимому, нужно через SET обратиться к
COUNT(dpc.ProductCategoryKey) OVER (PARTITION BY dpc.ProductCategoryKey, Year(s.OrderDate)
ORDER BY dpc.ProductCategoryKey) AS YearSales
или как? А дальше, как я обращаюсь к JOIN-у, через параметры процедуры?
Спасибо огромное, кто найдёт время на пару слов...
27 фев 16, 16:00    [18871558]     Ответить | Цитировать Сообщить модератору
 Re: Как написать процедуру исходя из запроса, объединяющего несколько таблиц (join-ов)  [new]
Владислав Колосов
Member

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

в Ваш запрос, который гуд, добавьте фильтр WHERE, в котором используйте @ProductCategoryKey и @Year.
Тот же count() возьмите без over().
27 фев 16, 17:40    [18871911]     Ответить | Цитировать Сообщить модератору
 Re: Как написать процедуру исходя из запроса, объединяющего несколько таблиц (join-ов)  [new]
Glory
Member

Откуда:
Сообщений: 104751
maxaaa
Но когда пытаюсь перекинуть это в процедуру, стопорюсь...

зачем вы напихали в SELECT переменных ?

maxaaa
Задание такое: составьте sp, которое получает как параметр код категории и год, и возвращает общее кол-во продаж в год.

Возвращает в каком виде ?
27 фев 16, 17:49    [18871939]     Ответить | Цитировать Сообщить модератору
 Re: Как написать процедуру исходя из запроса, объединяющего несколько таблиц (join-ов)  [new]
maxaaa
Member

Откуда:
Сообщений: 3
Владислав Колосов,

Вы имеете ввиду что-то такого плана?

CREATE PROCEDURE sp_SalesByCategories
  @ProductCategoryKey INT,
  @Year INT,
  @counter INT OUTPUT
  AS
  DECLARE 
	@ProductKey INT,
	@ProductSubcategoryKey INT
	SELECT DISTINCT @ProductKey=s.ProductKey
 FROM 
 FactInternetSales s JOIN DimProduct dp
 ON @ProductKey=dp.ProductKey
					 JOIN DimProductSubcategory dps
					 ON dp.ProductSubcategoryKey=@ProductSubcategoryKey
					 JOIN DimProductCategory dpc
					 ON @ProductCategoryKey=dps.ProductCategoryKey
WHERE @ProductCategoryKey=dpc.ProductCategoryKey 
			  and @Year=Year(s.OrderDate)
SET @counter = COUNT(@ProductCategoryKey) 
GO
27 фев 16, 18:42    [18872085]     Ответить | Цитировать Сообщить модератору
 Re: Как написать процедуру исходя из запроса, объединяющего несколько таблиц (join-ов)  [new]
maxaaa
Member

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

Вы абсолютно правы. Спасибо, Ваши вопросы меня сориентировали. Немного.
По видимому имеется ввиду некий OUTPUT.
Добавил его, но всё ещё не уверен в правильности, хоть и бежит без ошибки.
27 фев 16, 18:46    [18872093]     Ответить | Цитировать Сообщить модератору
 Re: Как написать процедуру исходя из запроса, объединяющего несколько таблиц (join-ов)  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8805
maxaaa, как-то так:

SELECT count(DISTINCT s.ProductKey)
 FROM 
 FactInternetSales s JOIN DimProduct dp
 ON s.ProductKey=dp.ProductKey
					 JOIN DimProductSubcategory dps
					 ON dp.ProductSubcategoryKey=dps.ProductSubcategoryKey
					 JOIN DimProductCategory dpc
					 ON dpc.ProductCategoryKey=dps.ProductCategoryKey
WHERE @ProductCategoryKey=dpc.ProductCategoryKey 
			  and @Year=Year(s.OrderDate)
27 фев 16, 18:46    [18872094]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить