Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Andrey_KI Member Откуда: Сообщений: 22 |
Всем доброе время суток! Есть задача. В одном запросе вывести различные сведения по категориям (количество продуктов, вес и т.п.) и в последней строке подвести итог. Т.е. Суммы по столбцам. Реализовал через Cursor. declare @kat VarChar(100), @kp int, @sumv decimal(10,2), @srv decimal(10,5), @srv1 decimal(10,5) --Итоговая таблица результата CREATE TABLE #rez(kat VarChar(100),kp int, sumv decimal(10,2), srv decimal(10,5), srv1 decimal(10,5)) DECLARE cursor_rowguid CURSOR FOR select distinct c.Name, COUNT(a.ProductID), SUM(a.Weight), AVG(a.Weight), SUM(a.Weight)/COUNT(a.ProductID) from Production.Product a left join Production.ProductSubCategory b on a.ProductSubcategoryID=b.ProductSubcategoryID left join Production.ProductCategory c on b.ProductCategoryID=c.ProductCategoryID --where a.ProductSubcategoryID is not null group by c.Name OPEN cursor_rowguid FETCH NEXT FROM cursor_rowguid INTO @kat, @kp, @sumv, @srv, @srv1 WHILE @@FETCH_STATUS = 0 BEGIN BEGIN Insert into #rez(kat,kp, sumv, srv, srv1) values (@kat, @kp, @sumv, @srv, @srv1) END FETCH NEXT FROM cursor_rowguid INTO @kat, @kp, @sumv, @srv, @srv1 END CLOSE cursor_rowguid DEALLOCATE cursor_rowguid select @kp=SUM(kp), @sumv=SUM(sumv), @srv=SUM(srv), @srv1=SUM(srv1) from #rez Insert into #rez(kat,kp, sumv, srv, srv1) values ('Total', @kp, @sumv, @srv, @srv1) SELECT kat as 'Категория',kp as 'Количество продуктов', sumv as 'Суммарный вес', srv as 'Средний вес', srv1 as 'Средний вес с учетом нулевых значений' FROM #rez DROP TABLE #rez go И вот думаю, а может огород нагородил? Может есть способ проще? |
31 май 17, 13:47 [20527291] Ответить | Цитировать Сообщить модератору |
asdor Member Откуда: Москва Сообщений: 508 |
Andrey_KI, выбрать все во временную таблицу, получить результирующую строку, добавить ее к это табле, и ее вернуть |
31 май 17, 13:57 [20527340] Ответить | Цитировать Сообщить модератору |
Serп
Guest |
Andrey_KI, Может быть: select distinct c.Name, COUNT(a.ProductID), SUM(a.Weight), AVG(a.Weight), SUM(a.Weight)/COUNT(a.ProductID) from Production.Product a left join Production.ProductSubCategory b on a.ProductSubcategoryID=b.ProductSubcategoryID left join Production.ProductCategory c on b.ProductCategoryID=c.ProductCategoryID --where a.ProductSubcategoryID is not null group by c.Name union select 'Total', COUNT(a.ProductID), SUM(a.Weight), AVG(a.Weight), SUM(a.Weight)/COUNT(a.ProductID) from Production.Product a left join Production.ProductSubCategory b on a.ProductSubcategoryID=b.ProductSubcategoryID left join Production.ProductCategory c on b.ProductCategoryID=c.ProductCategoryID --where a.ProductSubcategoryID is not null |
31 май 17, 13:58 [20527356] Ответить | Цитировать Сообщить модератору |
Ken@t Member Откуда: 大地 Сообщений: 3264 |
Andrey_KI, с сахаром ;WITH T AS ( SELECT '1' Id, 2.0 V UNION SELECT '2' Id, 3.0 V ) SELECT Id, V FROM T UNION ALL SELECT 'Summary' Id , SUM(V) V FROM T |
31 май 17, 13:59 [20527361] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9634 |
select case when grouping(c.Name) = 1 then 'Total' else c.Name end, COUNT(a.ProductID), SUM(a.Weight), AVG(a.Weight), SUM(a.Weight)/COUNT(a.ProductID) from Production.Product a left join Production.ProductSubCategory b on a.ProductSubcategoryID=b.ProductSubcategoryID left join Production.ProductCategory c on b.ProductCategoryID=c.ProductCategoryID group by grouping sets((), (c.Name)); |
||
31 май 17, 14:02 [20527375] Ответить | Цитировать Сообщить модератору |
Andrey_KI Member Откуда: Сообщений: 22 |
Мда... Так и знал что кувалдой забивал. |
31 май 17, 14:11 [20527429] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |