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

Откуда:
Сообщений: 116
есть таблица check_contents (содержимое чека) в которой есть столбец isection и yprice
в первом разбивка по отделам, во втором сумма
есть таблица chek (тело чека) здесь мне нужна только дата

мне нужно вывести итоговую сумму по всем отделам (их всего 4)
за определенное число

у меня вышло что типо

автор
select
SUM(yprice) as '1 отдел'
from check contents
inner join check
on check_contents.idbill = chek.idbill
where ddate between '20120816' and '20120816 23:59:59.999'
AND isection = 4

овтет
1 отдел
---------------------
1919,90
(строк обработано: 1)

как вывести еще 3 отделам одним запросом?
20 сен 12, 17:54    [13197961]     Ответить | Цитировать Сообщить модератору
 Re: sum()  [new]
group by
Guest
noTpyJI, use group by, Luke
20 сен 12, 17:56    [13197982]     Ответить | Цитировать Сообщить модератору
 Re: sum()  [new]
noTpyJI
Member

Откуда:
Сообщений: 116
group by
noTpyJI, use group by, Luke


а точнее
20 сен 12, 19:57    [13198423]     Ответить | Цитировать Сообщить модератору
 Re: sum()  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31438
noTpyJI
group by
noTpyJI, use group by, Luke


а точнее
Наберите в хелпе group by, там будут примеры. И если набрать SUM, тоже на них попадёте.
20 сен 12, 20:39    [13198581]     Ответить | Цитировать Сообщить модератору
 Re: sum()  [new]
noTpyJI
Member

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

автор
select
SUM(yprice) as '1 отдел'
from O_Bill_Det
inner join O_Bill
on O_Bill_Det.idbill = O_Bill.idbill
where ddate between '20120816' and '20120816 23:59:59.999'
AND isection = 1
group by ddate


получаю

1 отдел
---------------------
100,00
743,00
215,00
817,00

а нужно

1 отдел 2 отдел 3 отдел 4 отдел итого
---------- -------- -------- -------- --------
21968,42 17879,84 5821,00 1919,90 47589,16
20 сен 12, 20:48    [13198620]     Ответить | Цитировать Сообщить модератору
 Re: sum()  [new]
Посетитель
Member

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

тогда Вам нужен PIVOT либо Sum(case...)
20 сен 12, 23:01    [13198999]     Ответить | Цитировать Сообщить модератору
 Re: sum()  [new]
HukoJIau
Member

Откуда:
Сообщений: 8
noTpyJI
select
SUM(yprice) as '1 отдел'
from O_Bill_Det
inner join O_Bill
on O_Bill_Det.idbill = O_Bill.idbill
where ddate between '20120816' and '20120816 23:59:59.999'
AND isection = 1
group by ddate

Вообще Вы чего-то не того получаете, потому что по дате сгруппировали
select bd.isection
     , sum( bd.yprice ) as Summ
from O_Bill_Det bd
join O_Bill b
on bd.idbill = b.idbill
where b.ddate >= '20120816' -- between тут не советуется
  and b.ddate < '20120817' 

group by bd.isection
Если надо "повернуть", то к перечисленным можно что-то такое:
select ( select sum( bd.yprice )
              from O_Bill_Det bd
              join O_Bill b
              on bd.idbill = b.idbill
         where b.ddate >= '20120816'
           and b.ddate < '20120817' 
           and bd.isection = 1 ) as 'отдел 1'
     , ( select sum( bd.yprice )
              from O_Bill_Det bd
              join O_Bill b
              on bd.idbill = b.idbill
         where b.ddate >= '20120816'
           and b.ddate < '20120817' 
           and bd.isection = 2 ) as 'отдел 2'
...
20 сен 12, 23:32    [13199111]     Ответить | Цитировать Сообщить модератору
 Re: sum()  [new]
HukoJIau
Member

Откуда:
Сообщений: 8
select bd.isection
     , sum( bd.yprice ) as Summ
from O_Bill_Det bd
join O_Bill b
on bd.idbill = b.idbill
where b.ddate >= '20120816' -- between тут не советуется
  and b.ddate < '20120817' 
group by bd.isection
20 сен 12, 23:36    [13199124]     Ответить | Цитировать Сообщить модератору
 Re: sum()  [new]
Посетитель
Member

Откуда:
Сообщений: 1209
select sum(case bd.isection when 1 then bd.yprice end ) as Summ1
     , sum(case bd.isection when 2 then bd.yprice end ) as Summ2
     , sum(case bd.isection when 3 then bd.yprice end ) as Summ3
     , sum(case bd.isection when 4 then bd.yprice end ) as Summ4
     , sum( bd.yprice ) as SummTotal
from O_Bill_Det bd
join O_Bill b
on bd.idbill = b.idbill
where b.ddate >= '20120816' 
  and b.ddate < '20120817' 
21 сен 12, 00:19    [13199263]     Ответить | Цитировать Сообщить модератору
 Re: sum()  [new]
noTpyJI
Member

Откуда:
Сообщений: 116
Всем огромное спасибо!
Все варианты подходят идеально!!
21 сен 12, 12:55    [13201393]     Ответить | Цитировать Сообщить модератору
 Re: sum()  [new]
noTpyJI
Member

Откуда:
Сообщений: 116
Вот я сюда и вернулся!!!!

Помимо выше перечисленного есть таблица cashgain в ней есть столбцы ysum_n_10, ysum_n_18, ysum_c_10 и ysum_c_18
Нужно чтобы результат скрипта

use bookshop2
go
select
	isection as отдел,
	SUM(yprice) as сумма
from O_Bill
inner join O_Bill_det
on O_Bill_Det.idbill = O_Bill.idbill
where ddate >= '20120816' 
and ddate < '20120817'  
group by isection


записывался в таблицу cashgain в строки см. выше. в определенную дату (ddate) или по id (idcash)
30 сен 12, 01:28    [13244640]     Ответить | Цитировать Сообщить модератору
 Re: sum()  [new]
noTpyJI
Member

Откуда:
Сообщений: 116
вот что у меня получилось

USE bookshop2
go
DECLARE	
		@date1	date	= '20120816',
		@date2	date	= '20120817',
		@summ1	money	= (select 
		sum(case isection when 1 then yprice end ) as Summ1
from O_Bill_Det join O_Bill 
on O_Bill_Det.idbill = O_Bill.idbill
where @date <= ddate 
and @date1 > ddate),
		@summ2	money	= (select 
		sum(case isection when 2 then yprice end ) as Summ2
from O_Bill_Det 
join O_Bill 
on O_Bill_Det.idbill = O_Bill.idbill
where @date1 <= ddate 
and @date2 > ddate),
		@summ3	money	= (select 
		sum(case isection when 3 then yprice end ) as Summ3
from O_Bill_Det 
join O_Bill 
on O_Bill_Det.idbill = O_Bill.idbill
where @date1 <= ddate 
and @date2 > ddate),
		@summ4	money	= (select 
		sum(case isection when 4 then yprice end ) as Summ4
from O_Bill_Det 
join O_Bill 
on O_Bill_Det.idbill = O_Bill.idbill
where @date1 <= ddate 
and @date2 > ddate)
select @summ1, @summ2, @summ3, @summ4, @date, @date1
UPDATE O_CashGain
SET	 ysumm_c_10 = @summ1
	,ysumm_c_18 = @summ2
	,ysumm_n_10 = @summ3
	,ysumm_n_18 = @summ4
where idcash = 744
select * from O_CashGain
where idcash = 744 or idcash = 747

получаю

+
Сообщение 137, уровень 15, состояние 2, строка 7
Необходимо объявить скалярную переменную "@date".
Сообщение 137, уровень 15, состояние 2, строка 14
Необходимо объявить скалярную переменную "@date".
Сообщение 137, уровень 15, состояние 2, строка 21
Необходимо объявить скалярную переменную "@date".
Сообщение 137, уровень 15, состояние 2, строка 28
Необходимо объявить скалярную переменную "@date".
Сообщение 137, уровень 15, состояние 2, строка 30
Необходимо объявить скалярную переменную "@summ1".
Сообщение 137, уровень 15, состояние 2, строка 32
Необходимо объявить скалярную переменную "@summ1".


если убрать переменные @date1 @date2 и в значении where использовать
where ddate < 20120816
and ddate < 20120817
то все получается.

И наверное нужно было другую тему создать, не сердитесь на меня.
Я так больше не буду завтра создам новую тему.
КАЮСЬ
1 окт 12, 00:07    [13246904]     Ответить | Цитировать Сообщить модератору
 Re: sum()  [new]
Glory
Member

Откуда:
Сообщений: 104760
noTpyJI
получаю

Сообщение 137, уровень 15, состояние 2, строка 7
Необходимо объявить скалярную переменную "@date".
Сообщение 137, уровень 15, состояние 2, строка 14
Необходимо объявить скалярную переменную "@date".
Сообщение 137, уровень 15, состояние 2, строка 21
Необходимо объявить скалярную переменную "@date".
Сообщение 137, уровень 15, состояние 2, строка 28
Необходимо объявить скалярную переменную "@date".
Сообщение 137, уровень 15, состояние 2, строка 30
Необходимо объявить скалярную переменную "@summ1".
Сообщение 137, уровень 15, состояние 2, строка 32
Необходимо объявить скалярную переменную "@summ1".

И где в вашем скрипте объявление этих переменных ?
1 окт 12, 09:13    [13247419]     Ответить | Цитировать Сообщить модератору
 Re: sum()  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
noTpyJI
where ddate < 20120816
and ddate < 20120817
то все получается.
Получается что?!
20120816 - это 3 декабря 58888 года.
Вас действительно интересует, что у нас тут будет в этот день?
1 окт 12, 09:41    [13247527]     Ответить | Цитировать Сообщить модератору
 Re: sum()  [new]
noTpyJI
Member

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

О печатался
where b.ddate >= '20120816'
and b.ddate < '20120817'
1 окт 12, 09:56    [13247598]     Ответить | Цитировать Сообщить модератору
 Re: sum()  [new]
noTpyJI
Member

Откуда:
Сообщений: 116
и все таки как правильно задать переименую?
1 окт 12, 15:50    [13250411]     Ответить | Цитировать Сообщить модератору
 Re: sum()  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
noTpyJI
все таки как правильно задать переименую?

declare @имя_переменной  тип данных
1 окт 12, 15:51    [13250429]     Ответить | Цитировать Сообщить модератору
 Re: sum()  [new]
noTpyJI
Member

Откуда:
Сообщений: 116
Тогда в чем здесь ошибка

USE bookshop2
go
CREATE TABLE #update	(ChangeID int Primary Key Identity,
						idcash INT,ddate datetime, ysumm_c_10 money, ysumm_c_18 money,
						ysumm_n_10 money, ysumm_n_18 money, ddatesave datetime2)
DECLARE	@idcash int		=  '743',
		@date1	date	=  '20120816',
		@date2	date	=  '20120817',
		@summ1	money	=  (select 
		sum(case isection when 1 then yprice end ) as Summ1
from O_Bill_Det join O_Bill 
on O_Bill_Det.idbill = O_Bill.idbill
where ddate >= @date1 and ddate < @date2),
		@summ2	money	= (select 
		sum(case isection when 2 then yprice end ) as Summ2
from O_Bill_Det join O_Bill 
on O_Bill_Det.idbill = O_Bill.idbill
where ddate >= @date1 and ddate < @date2),
		@summ3	money	= (select 
		sum(case isection when 3 then yprice end ) as Summ3
from O_Bill_Det join O_Bill 
on O_Bill_Det.idbill = O_Bill.idbill
where ddate >= @date1 and ddate < @date2),
		@summ4	money	= (select 
		sum(case isection when 4 then yprice end ) as Summ4
from O_Bill_Det join O_Bill 
on O_Bill_Det.idbill = O_Bill.idbill
where ddate >= @date1 and ddate < @date2)
UPDATE O_CashGain
SET	 ysumm_c_10 = @summ1
	,ysumm_c_18 = @summ2
	,ysumm_n_10 = @summ3
	,ysumm_n_18 = @summ4
OUTPUT	inserted.idcash, inserted.ddate, inserted.ysumm_c_10, inserted.ysumm_c_18,
		inserted.ysumm_n_10, inserted.ysumm_n_18, GETDATE()
  INTO #update
where idcash = @idcash
select * from #update 
select * from O_CashGain
ORDER BY idcash DESC
1 окт 12, 16:07    [13250618]     Ответить | Цитировать Сообщить модератору
 Re: sum()  [new]
Glory
Member

Откуда:
Сообщений: 104760
noTpyJI
Тогда в чем здесь ошибка

Ну так вы ее прочитайте - и узнаете
1 окт 12, 16:08    [13250628]     Ответить | Цитировать Сообщить модератору
 Re: sum()  [new]
noTpyJI
Member

Откуда:
Сообщений: 116
может подскажите, я уже весь инет излазил нечего не нашел
Пожалуйста!
1 окт 12, 16:11    [13250659]     Ответить | Цитировать Сообщить модератору
 Re: sum()  [new]
Glory
Member

Откуда:
Сообщений: 104760
noTpyJI
может подскажите, я уже весь инет излазил нечего не нашел

Не надо лазить по всему интернету
Нужно открыть стандартный хелп продукта и изучить команду DECLARE
А не выдумывать ее синтаксис находу
1 окт 12, 16:14    [13250685]     Ответить | Цитировать Сообщить модератору
 Re: sum()  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
noTpyJI
может подскажите, я уже весь инет излазил нечего не нашел
Пожалуйста!


+
CREATE TABLE #update	(ChangeID int Primary Key Identity,
						idcash INT,ddate datetime, ysumm_c_10 money, ysumm_c_18 money,
						ysumm_n_10 money, ysumm_n_18 money, ddatesave datetime2)
DECLARE	@idcash int		=  '743',
		@date1	date	=  '20120816',
		@date2	date	=  '20120817',
		@summ1	money	,
		@summ2	money ,
		@summ3	money ,
		@summ4	money
		  set @summ1 = (select 
		sum(case isection when 1 then yprice end ) as Summ1
from O_Bill_Det join O_Bill 
on O_Bill_Det.idbill = O_Bill.idbill
where ddate >= @date1 and ddate < @date2)
	set	@summ2		= (select 
		sum(case isection when 2 then yprice end ) as Summ2
from O_Bill_Det join O_Bill 
on O_Bill_Det.idbill = O_Bill.idbill
where ddate >= @date1 and ddate < @date2)
	set	@summ3		= (select 
		sum(case isection when 3 then yprice end ) as Summ3
from O_Bill_Det join O_Bill 
on O_Bill_Det.idbill = O_Bill.idbill
where ddate >= @date1 and ddate < @date2)
	set	@summ4		= (select 
		sum(case isection when 4 then yprice end ) as Summ4
from O_Bill_Det join O_Bill 
on O_Bill_Det.idbill = O_Bill.idbill
where ddate >= @date1 and ddate < @date2)

UPDATE O_CashGain
SET	 ysumm_c_10 = @summ1
	,ysumm_c_18 = @summ2
	,ysumm_n_10 = @summ3
	,ysumm_n_18 = @summ4
OUTPUT	inserted.idcash, inserted.ddate, inserted.ysumm_c_10, inserted.ysumm_c_18,
		inserted.ysumm_n_10, inserted.ysumm_n_18, GETDATE()
  INTO #update
where idcash = @idcash
select * from #update 
select * from O_CashGain
ORDER BY idcash DESC
1 окт 12, 16:23    [13250794]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить