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

Откуда:
Сообщений: 200
есть таблица
id_zavod, value1,valu2...value_16
нужно получить итоговую таблицу
id_zavod1 id_zavod2
value1 sum(value1) sum(value1)
value2 sum(value2) sum(value2)

нужно получить суммы по каждому столбцу для каждого завода
есть идея пока делать в лоб
в темповую таблицу
select sum(r1.value_1) as zavod1,sum(r2.value_1) as zavod2 
from real r1 left join real r2 on r2.id_zavod= 3 
where r1.id_zavod = 2 

может есть проще способ?
15 фев 12, 19:02    [12098509]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
iljy
Member

Откуда:
Сообщений: 8711
Рострига Артур,

PIVOT
15 фев 12, 19:14    [12098571]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
Рострига Артур
Member

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

что-то не пойму
SELECT value_1, [2] AS Emp1, [3] AS Emp2, [4] AS Emp3, [5] AS Emp4, [6] AS Emp5
FROM 
(SELECT id, id_zavod,value_1
FROM real) p
PIVOT
(
COUNT (id)
FOR id_zavod IN
( [2], [3], [4], [5], [6] )
) AS pvt
15 фев 12, 19:28    [12098658]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
Рострига Артур
Member

Откуда:
Сообщений: 200
Рострига Артур,

SELECT sum([2]) AS Emp1, sum([3]) AS Emp2, sum([4]) AS Emp3, sum([5]) AS Emp4, sum([6]) AS Emp5
FROM
(SELECT id, id_zavod,value_1
FROM real) p
PIVOT
(
sum (value_1)
FOR id_zavod IN
( [2], [3], [4], [5], [6] )
) AS pvt
15 фев 12, 19:32    [12098674]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
Рострига Артур
Member

Откуда:
Сообщений: 200
а как сделать динамические условия?
ALTER PROCEDURE [dbo].[costs]
	@sd as DATETIME,
	@ed as DATETIME,
	@type as INT,
	@id_zavod as INT,
	@doptype as INT
AS
BEGIN
DECLARE @where as VARCHAR(255)
set @where = 'dateSend BETWEEN @sd and @ed '
if @type <>0 BEGIN 
set @where = @where+' and id_types = '+@type
end

SELECT  id_zavod,value_1
FROM real WHERE @where
15 фев 12, 21:24    [12099288]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
iljy
Member

Откуда:
Сообщений: 8711
Рострига Артур,

FAQ-переменное число критериев в запросе
15 фев 12, 22:02    [12099427]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
Рострига Артур
Member

Откуда:
Сообщений: 200
получилось.
помогите еще итоговую строку посчитать
SELECT  'Итого' as types,sum([2]) AS zavod_2, sum([3]) AS zavod_3, sum([4]) AS zavod_4, sum([5]) AS zavod_5, sum([6]) AS zavod_6
, sum([7]) AS zavod_7, sum([8]) AS zavod_8, sum([9]) AS zavod_9, sum([10]) AS zavod_10,sum(isnull([2],0)+isnull([3],0)+isnull([4],0)+isnull([5],0)+isnull([6],0)+isnull([7],0)+isnull([8],0)+isnull([9],0)+isnull([10],0)) as sums
FROM 
(SELECT  id_zavod,value_1,value_2,value_3,value_4,value_5,value_7,value_8,value_9,value_10,value_11,value_12,value_13,value_14,value_15,value_16
FROM real 
--WHERE id_types=ISNULL(@type,id_types) and id_doptypes =isnull(@doptype,id_doptypes) and dateSend BETWEEN @sd and @ed ) p
PIVOT
(
sum (isnull(value_1,0)+value_2+value_3+value_4+value_5+value_6+value_7+value_8+value_9+value_10+value_11+value_12+value_13+value_14+value_15+value_16)
FOR id_zavod IN
( [2], [3], [4], [5], [6],[7],[8],[9],[10] )
) AS pvt
15 фев 12, 23:34    [12099842]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
Рострига Артур
Member

Откуда:
Сообщений: 200
сделал
COMPUTE SUM([2]), SUM([3]) , SUM([4]), SUM([5]), SUM([6]), SUM([7]), SUM([8]), SUM([9]), SUM([10])

появилась ошибка
Msg 411, Level 16, State 1, Procedure costs, Line 9
COMPUTE clause #1, aggregate expression #1 is not in the select list.

что делать?
15 фев 12, 23:55    [12099921]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
iljy
Member

Откуда:
Сообщений: 8711
Рострига Артур,

не надо использовать COMPUTE, это атавизм. Используйте WITH ROLLUP
16 фев 12, 00:10    [12099966]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
Рострига Артур
Member

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

не пойму а как его в такой ситуации использовать
SELECT  'Топливо на технологию' as types,([2]) AS zavod_2, ([3]) AS zavod_3, ([4]) AS zavod_4, ([5]) AS zavod_5, ([6]) AS zavod_6
, ([7]) AS zavod_7, ([8]) AS zavod_8, ([9]) AS zavod_9, ([10]) AS zavod_10
,sum(isnull([2],0)+isnull([3],0)+isnull([4],0)+isnull([5],0)+isnull([6],0)+isnull([7],0)+isnull([8],0)+isnull([9],0)+isnull([10],0)) as sums
FROM 
(SELECT  id_zavod,value_2
FROM real 
--WHERE id_types=ISNULL(@type,id_types) and id_doptypes =isnull(@doptype,id_doptypes) and dateSend BETWEEN @sd and @ed 
) p
PIVOT
(
sum (value_2)
FOR id_zavod IN
( [2], [3], [4], [5], [6],[7],[8],[9],[10] )
) AS pvt
group by [2],[3],[4],[5],[6],[7],[8],[9],[10]
union all
SELECT  'Топливо ' as types,([2]) AS zavod_2, ([3]) AS zavod_3, ([4]) AS zavod_4, ([5]) AS zavod_5, ([6]) AS zavod_6
, ([7]) AS zavod_7, ([8]) AS zavod_8, ([9]) AS zavod_9, ([10]) AS zavod_10
,sum(isnull([2],0)+isnull([3],0)+isnull([4],0)+isnull([5],0)+isnull([6],0)+isnull([7],0)+isnull([8],0)+isnull([9],0)+isnull([10],0)) as sums
FROM 
(SELECT  id_zavod,value_3
FROM real 
--WHERE id_types=ISNULL(@type,id_types) and id_doptypes =isnull(@doptype,id_doptypes) and dateSend BETWEEN @sd and @ed 
) p
PIVOT
(
sum (value_3)
FOR id_zavod IN
( [2], [3], [4], [5], [6],[7],[8],[9],[10] )
) AS pvt
group by [2],[3],[4],[5],[6],[7],[8],[9],[10]
COMPUTE SUM([2]) , SUM([3]) , SUM([4]), SUM([5]), SUM([6]), SUM([7]), SUM([8]), SUM([9]), SUM([10])
16 фев 12, 00:21    [12100001]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
Glory
Member

Откуда:
Сообщений: 104751
Рострига Артур
не пойму а как его в такой ситуации использовать

Для - этого врядли. Нужно сразу переписать весь запрос.
Сначала все считать - а потом уже транспонировать
16 фев 12, 11:18    [12101305]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
Рострига Артур
Member

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

подскажите можно сделать типа такого
SELECT  'Металл' as types,[2] AS zavod_2, [3] AS zavod_3, [4] AS zavod_4, [5] AS zavod_5, [6] AS zavod_6
, [7] AS zavod_7, [8] AS zavod_8, [9] AS zavod_9, [10] AS zavod_10,0.0 as itc,0.0 as ck,sum(isnull([2],0)+isnull([3],0)+isnull([4],0)+isnull([5],0)+isnull([6],0)+isnull([7],0)+isnull([8],0)+isnull([9],0)) as sumsPP,
sum(isnull([2],0)+isnull([3],0)+isnull([4],0)+isnull([5],0)+isnull([6],0)+isnull([7],0)+isnull([8],0)+isnull([9],0)+isnull([10],0)) as sums
FROM 
(SELECT  id_zavod,value_1,value_10
FROM real 
--WHERE id_types=ISNULL(@type,id_types) and id_doptypes =isnull(@doptype,id_doptypes) and dateSend BETWEEN @sd and @ed 
) p
PIVOT
(
 isnull(value_1,0)+isnull(value_10,0)
FOR id_zavod IN
( [2], [3], [4], [5], [6],[7],[8],[9],[10] )
) AS pvt
group by [2],[3],[4],[5],[6],[7],[8],[9],[10]

как можно посчить сумму по всем полям value_1+value_10
17 фев 12, 20:34    [12113029]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
Glory
Member

Откуда:
Сообщений: 104751
Рострига Артур
подскажите можно сделать типа такого

Вы предлагаете по тексту запроса угадать, что вам нужно ?


Рострига Артур
как можно посчить сумму по всем полям value_1+value_10

Еще раз - сначала пишите запрос, который считает нужные суммы. А потом уже транспонируете его.
17 фев 12, 21:21    [12113288]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
Рострига Артур
Member

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

вот написал запрос
select  case GROUPING(zavod.name) when 0 then zavod.name else 'Total' end zavod,
isnull(sum(case real.value_1 when null then 0 else real.value_1 end),0) as value_1,
isnull(sum(case real.value_2 when null then 0 else real.value_2 end),0) as value_2,
isnull(sum(case real.value_3 when null then 0 else real.value_3 end),0) as value_3,
isnull(sum(case real.value_4 when null then 0 else real.value_4 end),0) as value_4,
isnull(sum(case real.value_4 when null then 0 else real.value_1 end),0)+
isnull(sum(case real.value_4 when null then 0 else real.value_2 end),0)+
isnull(sum(case real.value_4 when null then 0 else real.value_3 end),0) as total2,
isnull(sum(case real.value_4 when null then 0 else real.value_1 end),0)+
isnull(sum(case real.value_4 when null then 0 else real.value_2 end),0)+
isnull(sum(case real.value_4 when null then 0 else real.value_3 end),0)+
isnull(sum(case real.value_4 when null then 0 else real.value_4 end),0) as total
from real left join zavod on real.id_zavod=zavod.id
group by zavod.name with rollup

у меня есть таблица
id_zavod, value_1, value_2,value_3
мне нужно получить в столбце завод а в строке сумма по value_1 для этого завода
в идеале должно получится
zavod1, zavod2,zavod3, sum(zavod1+zavod2), sum(все заводы)
и сроку итогов все этого
17 фев 12, 21:35    [12113363]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
Рострига Артур
Member

Откуда:
Сообщений: 200
Рострига Артур,

а можно в PIVOT В функцию вставить несколько переменных?
у меня все получилось, только проблема 16 переменных делаю 16 запросов
17 фев 12, 22:06    [12113489]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить