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

Откуда:
Сообщений: 15
Доброго дня, решил заняться, sql. MSSQLserver2008
Комрады помогите плиз решить задачку. Надо что бы в результирующей таблицы суммы заняли свое место в соответствии от куда пришло поступление. При этом там где k_id одинаковый, надо что бы сумма занимала соответственно одну строку. И посчитать общий результат.
Имеющаяся таблица.
t_id K_id Summa Post
1 12 20,00 bank
2 12 300,00 sber
3 5 500,00 bank
4 6 100,00 par
5 10 500,00 bank
6 20 600,00 par
7 8 40,00 sber
9 8 80,00 sber



Должно получиться следующее.
t_id k_id summa zach bank sber par obshii rezultat
1 12 20,00 bank 20,00 300,000 0,00 320,00
2 12 300,00 sber 0 0 0 0
3 5 500,00 bank 500,00 0,00 0,00 500,00
4 6 100,00 par 0,00 0,00 100,00 100,00
5 10 500,00 bank 500,00 0,00 0,00 500,00
6 20 600,00 par 0,00 0,00 600,00 600,00
7 8 40,00 sber 0,00 120,00 0,00 120,00
9 8 80,00 sber 0,00 0 0,00 0


вот, что делаю я, но ни как не могу сообразить, как сделать, что все было в порядке с одинаковыми k_id
declare @t money
set @t=0
select *,
'bank'=case when zach='bank'then summa else 0 end,
'sber'=case when zach='sber'then summa else 0 end,
'par'=case when zach='par'then summa else 0 end,
'obshii rezultat'=@t+summa
from tbs
6 ноя 13, 16:28    [15085809]     Ответить | Цитировать Сообщить модератору
 Re: Помогите  [new]
Александр52
Member

Откуда: Кокосовые острова ส็็็็็
Сообщений: 5135
Airgolem, используйте обычный селект с группировкой (group by) по post, k_id, а так же при помощи функции sum().
6 ноя 13, 16:34    [15085869]     Ответить | Цитировать Сообщить модератору
 Re: Помогите  [new]
Airgolem
Member

Откуда:
Сообщений: 15
Александр52
Airgolem, используйте обычный селект с группировкой (group by) по post, k_id, а так же при помощи функции sum().


Msg 8120, Level 16, State 1, Line 3
Column 'tbs.t_id' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
ругается на меня
6 ноя 13, 16:42    [15085943]     Ответить | Цитировать Сообщить модератору
 Re: Помогите  [new]
Гость333
Member

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

Покажите текст запроса.
6 ноя 13, 16:57    [15086086]     Ответить | Цитировать Сообщить модератору
 Re: Помогите  [new]
Airgolem
Member

Откуда:
Сообщений: 15
Гость333,

declare @t money
set @t=0
select *,
'bank'=case when zach='bank'then summa else 0 end,
'sber'=case when zach='sber'then summa else 0 end,
'par'=case when zach='par'then summa else 0 end,
'obshii rezultat'=@t+summa
from tbs
group by k_id
6 ноя 13, 17:05    [15086136]     Ответить | Цитировать Сообщить модератору
 Re: Помогите  [new]
BuKTaP
Member

Откуда:
Сообщений: 132
мысль: может вместо * явно укажите нужные поля?
6 ноя 13, 17:12    [15086183]     Ответить | Цитировать Сообщить модератору
 Re: Помогите  [new]
Airgolem
Member

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

все таже ошибка, не помогло=(
6 ноя 13, 17:32    [15086315]     Ответить | Цитировать Сообщить модератору
 Re: Помогите  [new]
Гооооооссттььб
Guest
Бред какой то, что выбираете где агрегаты ?
6 ноя 13, 19:21    [15086879]     Ответить | Цитировать Сообщить модератору
 Re: Помогите  [new]
Гооооооссттььб
Guest
Declare @T Table(t_id int, k_id int,Summa money,Post varchar(20))

Insert into @T(t_id, k_id, Summa, Post) 
Values
(1,	12,	20.00,  'bank' ),
(2,	12,	300.00,	'sber' ),
(3,	5,	500.00,	'bank' ),
(4,	6,	100.00,	'par'  ),
(5,	10,	500.00,	'bank' ),
(6,	20,	600.00,	'par'  ),
(7,	8,	40.00,  'sber' ),
(9,	8,	80.00,  'sber' )

select 
k_id,
 Sum(case when Post ='Bank' then Summa else 0 end)  As Bank,
 Sum(case when Post ='Sber' then Summa else 0 end)  As Sber,
 Sum(case when Post ='Par' then Summa else 0 end)  As Par
 From @T
 group by k_id
6 ноя 13, 19:33    [15086918]     Ответить | Цитировать Сообщить модератору
 Re: Помогите  [new]
o-o
Guest
Гооооооссттььб,

угу. мне тоже кажется, что ему это надо. + итог(obshii rezultat).
но никак не пойму, что еще за "zach".

declare @t table (t_id int, K_id int, Summa money, Post varchar(100));
insert into @t (t_id, K_id, Summa, Post) values
(1, 12, 20, 'bank'),
(2, 12, 300, 'sber'),
(3, 5, 500, 'bank'),
(4, 6, 100, 'par'),
(5, 10, 500, 'bank'),
(6, 20, 600, 'par'),
(7, 8, 40, 'sber'),
(9, 8, 80, 'sber')

select K_id,
       sum(case post when 'bank' then Summa else 0 end) as bank,
       sum(case post when 'sber' then Summa else 0 end) as sber,
       sum(case post when 'par' then Summa else 0 end) as par,
       sum(Summa) as [obshii rezultat]
from @t
group by K_id
------------------------------------
K_id	bank	sber	par	obshii rezultat
5	500.00	0.00	0.00	500.00
6	0.00	0.00	100.00	100.00
8	0.00	120.00	0.00	120.00
10	500.00	0.00	0.00	500.00
12	20.00	300.00	0.00	320.00
20	0.00	0.00	600.00	600.00
6 ноя 13, 19:48    [15086971]     Ответить | Цитировать Сообщить модератору
 Re: Помогите  [new]
Airgolem
Member

Откуда:
Сообщений: 15
o-o,

Спасибо большое всем за помощь=)
7 ноя 13, 15:11    [15091326]     Ответить | Цитировать Сообщить модератору
 Re: Помогите  [new]
Airgolem
Member

Откуда:
Сообщений: 15
o-o,

zach вместо post ошибся в названии в первой таблице, извините
7 ноя 13, 15:22    [15091409]     Ответить | Цитировать Сообщить модератору
 Re: Помогите  [new]
o-o
Guest
Airgolem
o-o,

zach вместо post ошибся в названии в первой таблице, извините


не, ну так не пойдет.
Вы уж решите, надо собрать в одну строку с разными Post (как сейчас сделано)
или по Post тоже группировать, но тогда какой смысл расписывать по столбцам и итог считать?
получится же по строке на каждый Post,
в каждой стоке будет всего одно ненулевое значение, как раз соответсвующее этому Post и идущее в одноименный столбец:
declare @t table (t_id int, K_id int, Summa money, Post varchar(100));
insert into @t (t_id, K_id, Summa, Post) values
(1, 12, 20, 'bank'),
(2, 12, 300, 'sber'),
(3, 5, 500, 'bank'),
(4, 6, 100, 'par'),
(5, 10, 500, 'bank'),
(6, 20, 600, 'par'),
(7, 8, 40, 'sber'),
(9, 8, 80, 'sber')

select K_id, Post,
       sum(case post when 'bank' then Summa else 0 end) as bank,
       sum(case post when 'sber' then Summa else 0 end) as sber,
       sum(case post when 'par' then Summa else 0 end) as par,
       sum(Summa) as [obshii rezultat]
from @t
group by K_id, Post
order by 1, 2
--------------------------------------------
K_id	Post	bank	sber	par	obshii rezultat
5	bank	500.00	0.00	0.00	500.00
6	par	0.00	0.00	100.00	100.00
8	sber	0.00	120.00	0.00	120.00
10	bank	500.00	0.00	0.00	500.00
12	bank	20.00	0.00	0.00	20.00
12	sber	0.00	300.00	0.00	300.00
20	par	0.00	0.00	600.00	600.00
7 ноя 13, 15:41    [15091677]     Ответить | Цитировать Сообщить модератору
 Re: Помогите  [new]
Vaja_guest
Guest
автор
declare @t table (t_id int, K_id int, Summa money, Post varchar(100));
insert into @t (t_id, K_id, Summa, Post) values
(1, 12, 20, 'bank'),
(2, 12, 300, 'sber'),
(3, 5, 500, 'bank'),
(4, 6, 100, 'par'),
(5, 10, 500, 'bank'),
(6, 20, 600, 'par'),
(7, 8, 40, 'sber'),
(9, 8, 80, 'sber')



select K_id, Post, isnull([bank],0) as [bank], isnull([sber],0) as [sber], isnull([par],0) as [par], isnull([bank],0)+isnull([sber],0)+isnull([par],0) as [obshii rezultat]
from
(
select K_id,Post , Post as postsum, Summa
From @t ) as source
pivot (sum(Summa) for postsum IN ( [bank],[sber],[par])
) as PivotTable
order by 1, 2
7 ноя 13, 16:14    [15092068]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить