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

Откуда:
Сообщений: 86
Доброе утро!
Имеется таблица с препаратами прихода
ID int , -- код
Nlk_Name varchar(40) , -- наименование препарата
Sum_Opt money , -- оптовая сумма
Sum_Qnt float , --суммарное кол-во
SaleMonth datetime, -- месяц продаж
SaleYear datetime -- год продаж

Необходимо сделать выборку препаратов(сумму количества и сумму закупки) за год по месяцам, делаю так:
select ID, Nlk_Name,
sum(case when SaleMonth = 1 and SaleYear = 2011 then Sum_Qnt else null end) as Jan_qnt,
sum(case when SaleMonth = 1 and SaleYear = 2011 then (Sum_Opt / Sum_Qnt) else null end) as Jan_zakup,
sum(case when SaleMonth = 2 and SaleYear = 2011 then Sum_Qnt else null end) as Feb_qnt,
sum(case when SaleMonth = 2 and SaleYear = 2011 then (Sum_Opt / Sum_Qnt) else null end) as Feb_zakup,
...
from Nlk
GROUP BY ID, Nlk_Name

Необходимо в этом же запросе сделать выборку таких Nlk_Name, по которым был самый последний приход до 2011 года (например приход был 06.2010, 11.2010, 03.2007) выбрать одноименные препараты, которые были приняты 11.2010, как то так sum(case when SaleMonth = 11 and SaleYear = 2010 then Sum_Qnt else null end) as Old_qnt, вот только как программно выбрать SaleMonth = 11 and SaleYear = 2010 не соображу. Спасибо за помощь!
24 янв 12, 07:27    [11957530]     Ответить | Цитировать Сообщить модератору
 Re: Сложная выборка  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
Ну во первых SaleYear = 2011 на вынести в предложение where зачем сканить всю таблицу.
во вторых судя по всему надо, т.к SaleYear datetime и SaleMonth datetime ,то надо узать year и month соответственно.
в третьих можно посмотреть в сторону group by with rollup\cube
в четвертых есть оператор union и подзапросы.
24 янв 12, 09:00    [11957668]     Ответить | Цитировать Сообщить модератору
 Re: Сложная выборка  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
sa13m, Ну так отфильтруйте все что нужно до пивота.
24 янв 12, 09:40    [11957838]     Ответить | Цитировать Сообщить модератору
 Re: Сложная выборка  [new]
sa13m
Member

Откуда:
Сообщений: 86
denis2710
Ну во первых SaleYear = 2011 на вынести в предложение where зачем сканить всю таблицу.
во вторых судя по всему надо, т.к SaleYear datetime и SaleMonth datetime ,то надо узать year и month соответственно.
в третьих можно посмотреть в сторону group by with rollup\cube
в четвертых есть оператор union и подзапросы.


1)Извиняюсь, что сразу не сказал, SQL Server 2005.
2)SaleYear и SaleMonth уже в данной таблице разбиты на YEAR и MONTH соответственно
3) с union ничего в голову не приходит, если не затруднит пример, спасибо
25 янв 12, 11:03    [11966069]     Ответить | Цитировать Сообщить модератору
 Re: Сложная выборка  [new]
sa13m
Member

Откуда:
Сообщений: 86
kDnZP
sa13m, Ну так отфильтруйте все что нужно до пивота.


я с sql на вы, что вы имеете ввиду под словом 'пивот'?
25 янв 12, 11:04    [11966078]     Ответить | Цитировать Сообщить модератору
 Re: Сложная выборка  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
sa13m
я с sql на вы, что вы имеете ввиду под словом 'пивот'?

Поворот таблицы. В вашем случае аналог пивота это именно sum(case...

Т.е. сначала подготавливаете нужную выборку, а потом ее используете в развороте.
Как именно - это без тестовых данных и ожидаемого результата сказать невозможно.
25 янв 12, 11:08    [11966109]     Ответить | Цитировать Сообщить модератору
 Re: Сложная выборка  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
sa13m
denis2710
Ну во первых SaleYear = 2011 на вынести в предложение where зачем сканить всю таблицу.
во вторых судя по всему надо, т.к SaleYear datetime и SaleMonth datetime ,то надо узать year и month соответственно.
в третьих можно посмотреть в сторону group by with rollup\cube
в четвертых есть оператор union и подзапросы.


1)Извиняюсь, что сразу не сказал, SQL Server 2005.
2)SaleYear и SaleMonth уже в данной таблице разбиты на YEAR и MONTH соответственно
3) с union ничего в голову не приходит, если не затруднит пример, спасибо


1)В 2005 есть group by with rollup\cube
http://msdn.microsoft.com/en-us/library/ms177673(v=sql.90).aspx
посмотри чего делает и может тебе подойдет.
2)Тогда тип полей наверно int?
3)Ну у тебя 2 запроса
автор
Необходимо сделать выборку препаратов(сумму количества и сумму закупки) за год по месяцам, делаю так:
select ID, Nlk_Name,
sum(case when SaleMonth = 1 and SaleYear = 2011 then Sum_Qnt else null end) as Jan_qnt,
sum(case when SaleMonth = 1 and SaleYear = 2011 then (Sum_Opt / Sum_Qnt) else null end) as Jan_zakup,
sum(case when SaleMonth = 2 and SaleYear = 2011 then Sum_Qnt else null end) as Feb_qnt,
sum(case when SaleMonth = 2 and SaleYear = 2011 then (Sum_Opt / Sum_Qnt) else null end) as Feb_zakup,
...
from Nlk
GROUP BY ID, Nlk_Name

и
автор
Необходимо в этом же запросе сделать выборку таких Nlk_Name, по которым был самый последний приход до 2011 года (например приход был 06.2010, 11.2010, 03.2007) выбрать одноименные препараты, которые были приняты 11.2010, как то так sum(case when SaleMonth = 11 and SaleYear = 2010 then Sum_Qnt else null end) as Old_qnt, вот только как программно выбрать SaleMonth = 11 and SaleYear = 2010 не соображу

Объедени их union
25 янв 12, 11:20    [11966210]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить