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

Откуда:
Сообщений: 13
Всем доброе время суток!
Есть задача. В одном запросе вывести различные сведения по категориям (количество продуктов, вес и т.п.) и в последней строке подвести итог. Т.е. Суммы по столбцам. Реализовал через 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]     Ответить | Цитировать Сообщить модератору
 Re: Результирующая строка в запросе  [new]
asdor
Member

Откуда: Москва
Сообщений: 468
Andrey_KI,
выбрать все во временную таблицу, получить результирующую строку, добавить ее к это табле, и ее вернуть
31 май 17, 13:57    [20527340]     Ответить | Цитировать Сообщить модератору
 Re: Результирующая строка в запросе  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Результирующая строка в запросе  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Результирующая строка в запросе  [new]
invm
Member

Откуда: Москва
Сообщений: 9123
Andrey_KI
Может есть способ проще?
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]     Ответить | Цитировать Сообщить модератору
 Re: Результирующая строка в запросе  [new]
Andrey_KI
Member

Откуда:
Сообщений: 13
Мда... Так и знал что кувалдой забивал.
31 май 17, 14:11    [20527429]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить