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

Откуда:
Сообщений: 186
Всем привет!

Не могу разобраться с группировкой данных.

Есть таблица с данными типа:
Заказ Строка Номер
1245 0010 ррр
1245 0020 вар
7859 0080 арк


Мне нужен подсчёт данных по полю "Заказ". Результат должен выглядеть вот так:
Порядок Заказ Строка Номер
1 1245 0010 ррр
2 1245 0020 вар
1 7859 0080 арк


Я пытаюсь сделать вот так и получается совсем не то:
SELECT Заказ, Строка, Номер, count(*) as cnt
FROM Таблица
GROUP BY grouping sets (Заказ), Строка, Номер


Подскажите, пожалуйста, где ошибка?
18 ноя 14, 10:35    [16863543]     Ответить | Цитировать Сообщить модератору
 Re: Группировка данных  [new]
Ice_and_Fire
Guest
SELECT Заказ, Строка, Номер, RowNumber() ROW_NUMBER() OVER (PARTITION BY заказ ORDER BY строка) as Порядок
FROM Таблица
18 ноя 14, 10:44    [16863621]     Ответить | Цитировать Сообщить модератору
 Re: Группировка данных  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31978
LisSp
Подскажите, пожалуйста, где ошибка?
"Группировка", которую вы хотите получить вычислением count(*) as cnt, это вы имеете в виду нумерацию в группах?

Тогда нужно использовать ранжирующие функции, если версия сиквела позволяет.

ROW_NUMBER
18 ноя 14, 10:49    [16863665]     Ответить | Цитировать Сообщить модератору
 Re: Группировка данных  [new]
_djХомяГ
Guest
-----безотносительно версии упрощенно 
declare @t table ([Order] Int,Str varchar(10),Num varchar(10))
insert into @t 
select 1245,'0010','ppp'
union all
select 1245,'0020','вар'
union all
select 7589,'0080','арк'


select *,(select count(*) from @t t1 where t.[Order]=t1.[Order] and t.Str<=t1.Str) cnt from @t t
order by [Order],cnt
18 ноя 14, 10:52    [16863684]     Ответить | Цитировать Сообщить модератору
 Re: Группировка данных  [new]
LisSp
Member

Откуда:
Сообщений: 186
Ice_and_Fire
SELECT Заказ, Строка, Номер, RowNumber() ROW_NUMBER() OVER (PARTITION BY заказ ORDER BY строка) as Порядок
FROM Таблица


Большое спасибо!!! Это то, что нужно!
18 ноя 14, 12:08    [16864351]     Ответить | Цитировать Сообщить модератору
 Re: Группировка данных  [new]
LisSp
Member

Откуда:
Сообщений: 186
alexeyvg
LisSp
Подскажите, пожалуйста, где ошибка?
"Группировка", которую вы хотите получить вычислением count(*) as cnt, это вы имеете в виду нумерацию в группах?

Тогда нужно использовать ранжирующие функции, если версия сиквела позволяет.

ROW_NUMBER


Спасибо!
18 ноя 14, 12:09    [16864357]     Ответить | Цитировать Сообщить модератору
 Re: Группировка данных  [new]
LisSp
Member

Откуда:
Сообщений: 186
_djХомяГ
-----безотносительно версии упрощенно 
declare @t table ([Order] Int,Str varchar(10),Num varchar(10))
insert into @t 
select 1245,'0010','ppp'
union all
select 1245,'0020','вар'
union all
select 7589,'0080','арк'


select *,(select count(*) from @t t1 where t.[Order]=t1.[Order] and t.Str<=t1.Str) cnt from @t t
order by [Order],cnt


Через объединения таблиц вариант не подходит, т.к. реальное число строк 80 тыс. Да и вот выше подсказали вариант как одной строчкой сделать группировку партиционно.
18 ноя 14, 12:10    [16864371]     Ответить | Цитировать Сообщить модератору
 Re: Группировка данных  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31978
LisSp
Через объединения таблиц вариант не подходит, т.к. реальное число строк 80 тыс. Да и вот выше подсказали вариант как одной строчкой сделать группировку партиционно.
Где вы увидели "объединение таблиц"? :-)

Обычный запрос с подсчётом count для предыдущих строк, выполняется достаточно быстро, если есть нормальные индексы. Вполне подойдёт для случая старых версий.
На практике конечно для большинства не актуально, т.к. ROW_NUMBER уже давно появился.
18 ноя 14, 12:30    [16864557]     Ответить | Цитировать Сообщить модератору
 Re: Группировка данных  [new]
Glory
Member

Откуда:
Сообщений: 104751
LisSp
Через объединения таблиц вариант не подходит, т.к. реальное число строк 80 тыс.

insert into @t - это создание тестовой таблицы с данными. чтобы пример смог сработать
А не предложение вам написать 80 000 раз union вместо вашей готовой таблицы

Сообщение было отредактировано: 18 ноя 14, 12:43
18 ноя 14, 12:33    [16864577]     Ответить | Цитировать Сообщить модератору
 Re: Группировка данных  [new]
LisSp
Member

Откуда:
Сообщений: 186
alexeyvg
LisSp
Через объединения таблиц вариант не подходит, т.к. реальное число строк 80 тыс. Да и вот выше подсказали вариант как одной строчкой сделать группировку партиционно.
Где вы увидели "объединение таблиц"? :-)

Обычный запрос с подсчётом count для предыдущих строк, выполняется достаточно быстро, если есть нормальные индексы. Вполне подойдёт для случая старых версий.
На практике конечно для большинства не актуально, т.к. ROW_NUMBER уже давно появился.


Glory
LisSp
Через объединения таблиц вариант не подходит, т.к. реальное число строк 80 тыс.

insert into @t - это создание тестовой таблицы с данными. чтобы пример смог сработать
А не предложение вам написать 80 000 раз union вместо вашей готовой таблицы


Тьфу! Точно! А я гляжу на union all и вижу только объединение таблиц))) Alexeyvg, большое спасибо за ещё один вариант решения задачки!)
19 ноя 14, 10:40    [16869941]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить