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

Откуда:
Сообщений: 205
В таблице Table1 некоторой базы данных есть следующие строки:

Col1 Col2 Col3
----- ----- -----
E1000 A0 0
E1111 A1 1
E1222 A2 2
E1333 Val 3
E1444 Val 4
E1555 A5 5
E1666 A6 6
E1777 A7 7
E1888 A8 8
E1999 A9 9
E2000 B0 0
E2111 B0 1
E2222 B0 2
Необходимо построить запрос, который бы выдавал следующее:
MIN(Col1), Col2, SUM(Col3)
с группировкой относительно Col1, Col2, но только в том случае, если в Col1 первые 2 символа одинаковые, а у MIN(Col1) три последних символа равны '000'.
У меня запрос:
SELECT MIN(Col1), Col2, SUM(Col3)
FROM Table1
GROUP BY SUBSTRING(Col1,1,2), Col2

выдаёт следующее:

E1000 A0 0
E1111 A1 1
E1222 A2 2
E1333 Val 7
E1555 A5 5
E1666 A6 6
E1777 A7 7
E1888 A8 8
E1999 A9 9
E2000 B0 3
а нужно чтобы он выдавал следующее:

E1000 A0 0
E1111 A1 1
E1222 A2 2
E1333 Val 3
E1444 Val 4
E1555 A5 5
E1666 A6 6
E1777 A7 7
E1888 A8 8
E1999 A9 9
E2000 B0 3
т. к. у группировки по строке E1333 последние три символа не равны '000'.
Как это реализовать?
24 фев 15, 12:15    [17304359]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с группировкой по значению  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
CAST(RIGHT(Col1, LEN(Col1) -1) as int)

если там только то,что вы напиали в строке
24 фев 15, 12:22    [17304419]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с группировкой по значению  [new]
Degun
Member

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

Не совсем понял мысль. Можете запрос полностью привести?
24 фев 15, 12:29    [17304470]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с группировкой по значению  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
SELECT MIN(Col1), Col2, SUM(Col3)
FROM Table1
GROUP BY CAST(RIGHT(Col1, LEN(Col1) -1) as int) , Col2
24 фев 15, 12:32    [17304490]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с группировкой по значению  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Degun
а у MIN(Col1) три последних символа равны '000'
HAVING
24 фев 15, 12:33    [17304502]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с группировкой по значению  [new]
Degun
Member

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

HAVING действует как условие на уже сформировавшиеся группировки. А нужно управлять формированием самих группировок! Т. е. если запрос будет следующим:
SELECT MIN(Col1), Col2, SUM(Col3)
FROM TableTemp1
GROUP BY SUBSTRING(Col1,1,2), Col2
HAVING SUBSTRING(MIN(Col1),3,3) = '000'

то результат будет следующим:

E1000 A0 0
E2000 B0 3
что не правильно.
24 фев 15, 12:56    [17304713]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с группировкой по значению  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Degun
iap,

HAVING действует как условие на уже сформировавшиеся группировки. А нужно управлять формированием самих группировок! Т. е. если запрос будет следующим:
SELECT MIN(Col1), Col2, SUM(Col3)
FROM TableTemp1
GROUP BY SUBSTRING(Col1,1,2), Col2
HAVING SUBSTRING(MIN(Col1),3,3) = '000'


то результат будет следующим:

E1000 A0 0
E2000 B0 3
что не правильно.
Почему? Это в точности соответствует тексту первого сообщения темы, который я процитировал.
24 фев 15, 13:02    [17304748]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с группировкой по значению  [new]
Degun
Member

Откуда:
Сообщений: 205
Maxx,
SELECT MIN(Col1), Col2, SUM(Col3)
FROM Table1
GROUP BY CAST(RIGHT(Col1, LEN(Col1) -1) as int) , Col2

Не то, что нужно. Пропадает группировка - фактически выдаются все строки в таблице. Вот его результат:

E1000 A0 0
E1111 A1 1
E1222 A2 2
E1555 A5 5
E1666 A6 6
E1777 A7 7
E1888 A8 8
E1999 A9 9
E2000 B0 0
E2111 B0 1
E2222 B0 2
E1333 Val 3
E1444 Val 4
24 фев 15, 13:05    [17304781]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с группировкой по значению  [new]
Degun
Member

Откуда:
Сообщений: 205
iap
Почему? Это в точности соответствует тексту первого сообщения темы, который я процитировал.

Я в своём первоначальном сообщении написал какой мне нужен результат:

E1000 A0 0
E1111 A1 1
E1222 A2 2
E1333 Val 3
E1444 Val 4
E1555 A5 5
E1666 A6 6
E1777 A7 7
E1888 A8 8
E1999 A9 9
E2000 B0 3
24 фев 15, 13:09    [17304808]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с группировкой по значению  [new]
Maxx
Member [скрыт]

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

а надо как ? Выб нормальный пример с тестовыми даными дали..в ручную набивать нет времени
Да и по какмоу критериию Е1000 -Е2000 должно счиаться ,а остальное нет ? Віж китерий то не дали толком
24 фев 15, 13:09    [17304814]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с группировкой по значению  [new]
invm
Member

Откуда: Москва
Сообщений: 9841
with x as
(
 select
  *, case when min(col1) over (partition by left(col1, 2), col2) like '%000' then 1 end as f
 from
  Table1
)
select
 min(col1), col2, sum(col3)
from
 x
group by
 case when x.f = 1 then left(col1, 2) else col1 end, col2;
24 фев 15, 13:37    [17304981]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с группировкой по значению  [new]
Degun
Member

Откуда:
Сообщений: 205
Maxx,
Вот тестовый пример:
create Table Table1(Col1 varchar(10), Col2 varchar(10), Col3 decimal(20,4))
insert into Table1 values('E1000','A0',0)
insert into Table1 values('E1111','A1',1)
insert into Table1 values('E1222','A2',2)
insert into Table1 values('E1333','Val',3)
insert into Table1 values('E1444','Val',4)
insert into Table1 values('E1555','A5',5)
insert into Table1 values('E1666','A6',6)
insert into Table1 values('E1777','A7',7)
insert into Table1 values('E1888','A8',8)
insert into Table1 values('E1999','A9',9)
insert into Table1 values('E2000','B0',0)
insert into Table1 values('E2111','B0',1)
insert into Table1 values('E2222','B0',2)

Мне нужно так доработать запрос:
SELECT MIN(Col1), Col2, SUM(Col3)
FROM Table1
GROUP BY SUBSTRING(Col1,1,2), Col2

чтобы он выдавал следующее:

E1000 A0 0
E1111 A1 1
E1222 A2 2
E1333 Val 3
E1444 Val 4
E1555 A5 5
E1666 A6 6
E1777 A7 7
E1888 A8 8
E1999 A9 9
E2000 B0 3
т. е. в запросе должно быть так, чтобы не формировались группировки, у которых в MIN(Col1) три последних символа не равны '000'.
Это означает, что если есть группа строк, для которых:
1. SUBSTRING(Col1,1,2) совпадают
2. SUBSTRING(MIN(Col1),3,3) = '000',
то для этой группы строк формируется группировка и на выход от этой группы строк попадает всего одна строка:
MIN(Col1) Col1, Col2, SUM(Col3)
Если условия не соблюдаются, то иначе на выход попадают сами исходные строки:
Col1, Col2, Col3
24 фев 15, 13:44    [17305018]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с группировкой по значению  [new]
Maxx
Member [скрыт]

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

вам уже invm нарисовал
24 фев 15, 13:49    [17305049]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с группировкой по значению  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
HAVING COUNT(*)=1 OR MIN(Col1) LIKE '%000'
24 фев 15, 13:50    [17305056]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с группировкой по значению  [new]
Degun
Member

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

Спасибо. Ваш запрос работает.
24 фев 15, 14:10    [17305166]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с группировкой по значению  [new]
invm
Member

Откуда: Москва
Сообщений: 9841
Degun
invm,

Спасибо. Ваш запрос работает.
Только если (col1, col2) уникально.
24 фев 15, 14:21    [17305246]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить