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

Откуда: г. Калуга
Сообщений: 1198
Есть такой вот запросик. Как видим в секции GROUP BY и в секции SELECT по сути одинаковый код.
Можно ли как-то минимизировать эту запись, чтоб, его не дублировать, может какие-то хитрости синтаксиса, которых я не знаю.
Вариант вынести в функцию я знаю, но речь не про это сейчас
select datepart(yyyy, Cl.clDAte) as [year], 
		case @PeriodGroupType
    	          when 3 then dbo.UDF_QuarterDatePart(Cl.clDAte) 
                  when 2 then datepart(mm, Cl.clDAte)
                  when 1 then datepart(ww, Cl.clDAte)
                  when 0 then datepart(mm, Cl.clDAte)*100 + datepart(dd, Cl.clDAte)
               end as [datepart],
		               Sum(IsNull(WS.Amount, 0)) as Amount,
			       SUM(IsNull(WS.Cost, 0)) as Cost, 
			       SUM(IsNull(WS.Cost, 0) - IsNull(WS.SelfCost, 0)) as Profit			
		from  #Calendar Cl
					left join waresellEx WS	on Cl.clDAte = WS.SellDate
		group by datepart(yyyy, Cl.clDAte), 
		         case @PeriodGroupType
    	                    when 3 then dbo.UDF_QuarterDatePart(Cl.clDAte) 
                            when 2 then datepart(mm, Cl.clDAte)
                            when 1 then datepart(ww, Cl.clDAte)
                            when 0 then datepart(mm, Cl.clDAte)*100 + datepart(dd, Cl.clDAte)
                         end        
31 мар 16, 17:22    [19001455]     Ответить | Цитировать Сообщить модератору
 Re: данные, по которым группировка в секции Select  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37050
declare
    @PeriodGroupType int

select 
    r.[year]
    , r.[datepart]
    , Sum(IsNull(WS.Amount, 0)) as Amount
    , SUM(IsNull(WS.Cost, 0)) as Cost 
    , SUM(IsNull(WS.Cost, 0) - IsNull(WS.SelfCost, 0)) as Profit
from  #Calendar Cl
left join waresellEx WS	on Cl.clDAte = WS.SellDate
cross apply (
    select
        [year] = datepart(yyyy, Cl.clDAte)
        , [datepart] = case @PeriodGroupType
            when 3 then dbo.UDF_QuarterDatePart(Cl.clDAte) 
            when 2 then datepart(mm, Cl.clDAte)
            when 1 then datepart(ww, Cl.clDAte)
            when 0 then datepart(mm, Cl.clDAte)*100 + datepart(dd, Cl.clDAte)
        end  
) r
group by 
    r.[year]
    , r.[datepart]


Сообщение было отредактировано: 31 мар 16, 17:29
31 мар 16, 17:28    [19001489]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить