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

Откуда:
Сообщений: 271
Подскажите пожалуйста, что нужно прописать в group by чтобы выполнялась группировка по значению case?

DECLARE @DatePaymentfrom date, @DatePaymenttill date;
SET  @DatePaymentfrom = '20140101'
SET  @DatePaymenttill = '20140901';

DECLARE @banc TABLE (mask1 NVARCHAR(100), mask2 NVARCHAR(100),name NVARCHAR(100));
INSERT @banc (mask1,mask2, name) VALUES 
   
  (N'%Банк%','',  N'Инбанк');

  	  SELECT case 
	  when round((t.SumPaymentTotal/t.SumPart*100 ),2) >3.5 and round((t.SumPaymentTotal/t.SumPart*100 ),2) <=4 then N'від 3,5%-4%'
	  when round((t.SumPaymentTotal/t.SumPart*100 ),2) >4 and round((t.SumPaymentTotal/t.SumPart*100 ),2) <=5.5 then N'від 4%-5,5%'
	  when round((t.SumPaymentTotal/t.SumPart*100 ),2) >5.5 and round((t.SumPaymentTotal/t.SumPart*100 ),2) <=6.5 then N'від 5,5%-6,5%'
	  when round((t.SumPaymentTotal/t.SumPart*100 ),2) >6.5 and round((t.SumPaymentTotal/t.SumPart*100 ),2) <=7.5 then N'від 6,5%-7,5%'
	  else N'від 7,5%'
	  end as 'Тариф'
	  ,sum(t.[Sum]) as 'Начислено'
	  ,count (distinct t.cnumber) as 'Количество'
           FROM [data].[dbo].[Tab1]  t
           right JOIN @banc b ON      t.Client  LIKE  b.mask1 
           WHERE  t.[DateContract] between  @DatePaymentfrom and  @DatePaymenttill 
	  GROUP BY round((t.SumPaymentTotal/t.SumPart*100 ),2)
12 сен 14, 17:03    [16569559]     Ответить | Цитировать Сообщить модератору
 Re: Группировка case  [new]
Glory
Member

Откуда:
Сообщений: 104751
2viper2viper
Подскажите пожалуйста, что нужно прописать в group by чтобы выполнялась группировка по значению case?

Весь case и надо писать
12 сен 14, 17:05    [16569570]     Ответить | Цитировать Сообщить модератору
 Re: Группировка case  [new]
Maxx_UA
Guest
case и прописать
12 сен 14, 17:05    [16569576]     Ответить | Цитировать Сообщить модератору
 Re: Группировка case  [new]
ГуЗы
Guest
2viper2viper,
select case ... end,
sum(F1)
 from table
group by 
case ... end
12 сен 14, 17:06    [16569578]     Ответить | Цитировать Сообщить модератору
 Re: Группировка case  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
точно, что-то сказывается пятница :)
Спасибо
12 сен 14, 17:09    [16569597]     Ответить | Цитировать Сообщить модератору
 Re: Группировка case  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4832
2viper2viper
точно, что-то сказывается пятница :)
Спасибо


Вы сделайте подзапрос или CTE и подсчитайте в нём ваш громозкий CASE, а затем используете полученное поле вGroupBy
12 сен 14, 17:26    [16569673]     Ответить | Цитировать Сообщить модератору
 Re: Группировка case  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
a_voronin
2viper2viper
точно, что-то сказывается пятница :)
Спасибо


Вы сделайте подзапрос или CTE и подсчитайте в нём ваш громозкий CASE, а затем используете полученное поле вGroupBy


А что это даст? В подзапросе и CTE тоже придется дважды прописывать весь CASE
2 окт 14, 16:24    [16651444]     Ответить | Цитировать Сообщить модератору
 Re: Группировка case  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4832
2viper2viper,

select sum(F1), cs
from (SELECT case ... end as cs, F1 FROM table) A
group by cs
2 окт 14, 16:27    [16651458]     Ответить | Цитировать Сообщить модератору
 Re: Группировка case  [new]
iap
Member

Откуда: Москва
Сообщений: 47085
2viper2viper
a_voronin
пропущено...


Вы сделайте подзапрос или CTE и подсчитайте в нём ваш громозкий CASE, а затем используете полученное поле вGroupBy


А что это даст? В подзапросе и CTE тоже придется дважды прописывать весь CASE
Почему?
2 окт 14, 16:27    [16651463]     Ответить | Цитировать Сообщить модератору
 Re: Группировка case  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
может я не правильно понял принцип реализации.
Такой запрос возвращает ошибку про отсутствие case в group by:

DECLARE @DatePaymentfrom date, @DatePaymenttill date;
SET  @DatePaymentfrom = '20140101'
SET  @DatePaymenttill = '20140901';

DECLARE @banc TABLE (mask1 NVARCHAR(100), mask2 NVARCHAR(100),name NVARCHAR(100));
INSERT @banc (mask1,mask2, name) VALUES 
   
 (N'%Банк%','',  N'Инбанк');

  with ste as ( 

  	  SELECT  case 
	  when round((t.SumPaymentTotal/t.SumInsured*100 ),2) >3.5 and round((t.SumPaymentTotal/t.SumInsured*100 ),2) <=4 then N'від 3,5%-4%'
	  when round((t.SumPaymentTotal/t.SumInsured*100 ),2) >4 and round((t.SumPaymentTotal/t.SumInsured*100 ),2) <=5.5 then N'від 4%-5,5%'
	  when round((t.SumPaymentTotal/t.SumInsured*100 ),2) >5.5 and round((t.SumPaymentTotal/t.SumInsured*100 ),2) <=6.5 then N'від 5,5%-6,5%'
	  when round((t.SumPaymentTotal/t.SumInsured*100 ),2) >6.5 and round((t.SumPaymentTotal/t.SumInsured*100 ),2) <=7.5 then N'від 6,5%-7,5%'
	  else N'від 7,5%'
	  end as 'Тариф'
	  ,sum(t.[76]) as 'Начислено'
	  ,count (distinct t.contractnumber) as 'Количество'
           FROM [data].[dbo].[Tab1]  t
           right JOIN @banc b ON      t.Client  LIKE  b.mask1 
           WHERE  t.[DateContract] between  @DatePaymentfrom and  @DatePaymenttill )

		select * from ste
	

Как правильно поместить case в СТЕ?
2 окт 14, 17:19    [16651819]     Ответить | Цитировать Сообщить модератору
 Re: Группировка case  [new]
iap
Member

Откуда: Москва
Сообщений: 47085
2viper2viper
может я не правильно понял принцип реализации.
Такой запрос возвращает ошибку про отсутствие case в group by:

DECLARE @DatePaymentfrom date, @DatePaymenttill date;
SET  @DatePaymentfrom = '20140101'
SET  @DatePaymenttill = '20140901';

DECLARE @banc TABLE (mask1 NVARCHAR(100), mask2 NVARCHAR(100),name NVARCHAR(100));
INSERT @banc (mask1,mask2, name) VALUES 
   
 (N'%Банк%','',  N'Инбанк');

  with ste as ( 

  	  SELECT  case 
	  when round((t.SumPaymentTotal/t.SumInsured*100 ),2) >3.5 and round((t.SumPaymentTotal/t.SumInsured*100 ),2) <=4 then N'від 3,5%-4%'
	  when round((t.SumPaymentTotal/t.SumInsured*100 ),2) >4 and round((t.SumPaymentTotal/t.SumInsured*100 ),2) <=5.5 then N'від 4%-5,5%'
	  when round((t.SumPaymentTotal/t.SumInsured*100 ),2) >5.5 and round((t.SumPaymentTotal/t.SumInsured*100 ),2) <=6.5 then N'від 5,5%-6,5%'
	  when round((t.SumPaymentTotal/t.SumInsured*100 ),2) >6.5 and round((t.SumPaymentTotal/t.SumInsured*100 ),2) <=7.5 then N'від 6,5%-7,5%'
	  else N'від 7,5%'
	  end as 'Тариф'
	  ,sum(t.[76]) as 'Начислено'
	  ,count (distinct t.contractnumber) as 'Количество'
           FROM [data].[dbo].[Tab1]  t
           right JOIN @banc b ON      t.Client  LIKE  b.mask1 
           WHERE  t.[DateContract] between  @DatePaymentfrom and  @DatePaymenttill )

		select * from ste
	


Как правильно поместить case в СТЕ?
Без агрегатов и GROUP BY.
А снаружи уже использовать поля CTE, агрегаты и GROUP BY.
2 окт 14, 17:25    [16651848]     Ответить | Цитировать Сообщить модератору
 Re: Группировка case  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4832
2viper2viper
может я не правильно понял принцип реализации.
Такой запрос возвращает ошибку про отсутствие case в group by:

DECLARE @DatePaymentfrom date, @DatePaymenttill date;
SET  @DatePaymentfrom = '20140101'
SET  @DatePaymenttill = '20140901';

DECLARE @banc TABLE (mask1 NVARCHAR(100), mask2 NVARCHAR(100),name NVARCHAR(100));
INSERT @banc (mask1,mask2, name) VALUES 
   
 (N'%Банк%','',  N'Инбанк');

  with ste as ( 

  	  SELECT  case 
	  when round((t.SumPaymentTotal/t.SumInsured*100 ),2) >3.5 and round((t.SumPaymentTotal/t.SumInsured*100 ),2) <=4 then N'від 3,5%-4%'
	  when round((t.SumPaymentTotal/t.SumInsured*100 ),2) >4 and round((t.SumPaymentTotal/t.SumInsured*100 ),2) <=5.5 then N'від 4%-5,5%'
	  when round((t.SumPaymentTotal/t.SumInsured*100 ),2) >5.5 and round((t.SumPaymentTotal/t.SumInsured*100 ),2) <=6.5 then N'від 5,5%-6,5%'
	  when round((t.SumPaymentTotal/t.SumInsured*100 ),2) >6.5 and round((t.SumPaymentTotal/t.SumInsured*100 ),2) <=7.5 then N'від 6,5%-7,5%'
	  else N'від 7,5%'
	  end as [Тариф], t.contractnumber, t.[76]
           FROM [data].[dbo].[Tab1]  t
           right JOIN @banc b ON      t.Client  LIKE  b.mask1 
           WHERE  t.[DateContract] between  @DatePaymentfrom and  @DatePaymenttill )

select [Тариф]
	  ,sum([76]) as 'Начислено'
	  ,count (distinct contractnumber) as 'Количество'
from ste
GROUP BY [Тариф]

Как правильно поместить case в СТЕ?


синтаксис подправите, если я где ошибся
2 окт 14, 17:29    [16651882]     Ответить | Цитировать Сообщить модератору
 Re: Группировка case  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Еще можно CROSS APPLY применить для повторного использования выражений.
select 
  GT.G
from Table PT
CROSS APPLY 
  (
    SELECT CASE WHEN T.column = 1 THEN 1 ELSE 0 END AS G
  ) GT
GROUP BY GT.G
2 окт 14, 23:16    [16653418]     Ответить | Цитировать Сообщить модератору
 Re: Группировка case  [new]
2viper2viper
Member

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

Спасибо за подсказку)
6 окт 14, 12:14    [16665279]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить