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

Откуда:
Сообщений: 88
Вопрос наверное простой но надо очень срочно
Есть два запроса:
Первый:
-------------------------
Select Distinct
Rtrim(s.firstname)+' '+Rtrim(s.lastname)+' '+Rtrim(s.subname)+' ' As fio,
s.tabnum,
monthplus = Null, monthminus = Null, Round(Sum(i.varcount * i.shiftindex), 0, 1) As monthsumma,
polygplus = Null, polygminus = Null, polygsumma = Null, IsNull(s.idstaff,0) As idstaff
, idsubdiv
From staff s, staffindex i
Where i.idstaff = s.idstaff
And Year(i.datefixing) = 2004
And Month(i.datefixing) = 1
And s.tabnum = 5390
Group By s.firstname, s.lastname, s.subname, s.tabnum, s.idstaff, i.idsubdiv
-----------------------------------
второй:
-----------------------------------
Select
i.idstaff, i.idsubdiv,
i.datefixing,
s.tabnum, s.firstname, s.lastname, s.subname,
Round(Sum(i.varcount * i.shiftindex), 0, 1) As monthsumma,
flag =
Case When i.flagcompl = 0 Then 'Да' Else 'Нет' End,
i.shiftindex
From staff s, staffindex i
Where i.idstaff = s.idstaff
And Year(i.datefixing) = 2004
And Month(i.datefixing) = 1
And s.tabnum = 5390
Group By
i.idstaff, i.idsubdiv,
i.datefixing,
s.tabnum, s.firstname, s.lastname, s.subname,
i.flagcompl, i.shiftindex
----------------------------------------
Первый возвращает итоговую строку за месяц по сотруднику:
Round(Sum(i.varcount * i.shiftindex), 0, 1) As monthsumma -> 1 строка баллы = 676

Второй по дням месяца:
Round(Sum(i.varcount * i.shiftindex), 0, 1) As monthsumma -> 9 строк по 75 баллов = 675
Отличие в групировке по дате i.datefixing
Поля
i.varcount int, i.shiftindex money

Если не трудно помогите пожайлуста понять почему цифры не совпадают?
11 фев 04, 14:32    [531022]     Ответить | Цитировать Сообщить модератору
 Re: Непонятно с Group By  [new]
MiCe
Member

Откуда: RUSSIA STAVROPOL Pyatigorsk
Сообщений: 1996
Это случайно не БЭСТ?
-------------------------------------
никогда не говорю никогда....
11 фев 04, 14:36    [531035]     Ответить | Цитировать Сообщить модератору
 Re: Непонятно с Group By  [new]
MiCe
Member

Откуда: RUSSIA STAVROPOL Pyatigorsk
Сообщений: 1996
о апшипка из за копеек.... в первомслучае вы суммируете все и потом округляете....
а во втором случае вы округляете по дням...
-------------------------------------
никогда не говорю никогда....
11 фев 04, 14:40    [531046]     Ответить | Цитировать Сообщить модератору
 Re: Непонятно с Group By  [new]
mao04
Member

Откуда:
Сообщений: 88
Нет это не БЭСТ.
Да и i.shiftindex для каждой даты const.
Что делать?
11 фев 04, 14:40    [531048]     Ответить | Цитировать Сообщить модератору
 Re: Непонятно с Group By  [new]
mao04
Member

Откуда:
Сообщений: 88
И i.varcount тоже для каждой даты const.
11 фев 04, 14:42    [531052]     Ответить | Цитировать Сообщить модератору
 Re: Непонятно с Group By  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
дело не в группировках, а в
[color=red]Round([/color]Sum(i.varcount * i.shiftindex)[color=red], 0, 1) [/color]

собственно... сначала происходи сумма, потом огругляется...
итак
1 запрос
в итоге 75.1 * 9 = 675.9 round 676

2 запрос
в итоге round 75.1 =75 * 9 = 675

я думаю все таки в этом причина
попробуйте
Sum(Round(i.varcount * i.shiftindex, 0, 1))



для спящего время бодрствования равносильно сну
11 фев 04, 14:43    [531055]     Ответить | Цитировать Сообщить модератору
 Re: Непонятно с Group By  [new]
mao04
Member

Откуда:
Сообщений: 88
2Алексей2003

Так пробовал
Sum(Round(i.varcount * i.shiftindex, 0, 1)) As monthsumma,
Эффект = 648.0000 в 1 случае поротив 675 во втором :(
11 фев 04, 14:47    [531065]     Ответить | Цитировать Сообщить модератору
 Re: Непонятно с Group By  [new]
mao04
Member

Откуда:
Сообщений: 88
Неужели делать через промежуточную таблицу а потом суммировать с группировкой по дате?
Чтото не то :(
11 фев 04, 14:51    [531078]     Ответить | Цитировать Сообщить модератору
 Re: Непонятно с Group By  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
автор
i.shiftindex для каждой даты const.
.
.
.
И i.varcount тоже для каждой даты const.


А какого типа, всё-таки, эти колонки?
11 фев 04, 15:07    [531124]     Ответить | Цитировать Сообщить модератору
 Re: Непонятно с Group By  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
в первом случае
select * from staff s inner join 

(select idstaff, Round(Sum(i.varcount * i.shiftindex), 0, 1) summ from staffindex group by datefixing) i on i.idstaff = s.idstaff


во втором случае
select * from staff s inner join 

(select idstaff, sum(round(summ,0,1)) from
(select idstaff, Round(Sum(i.varcount * i.shiftindex), 0, 1)summ from staffindex group by datefixing
) i2
) i on i.idstaff = s.idstaff



для спящего время бодрствования равносильно сну
11 фев 04, 15:12    [531143]     Ответить | Цитировать Сообщить модератору
 Re: Непонятно с Group By  [new]
mao04
Member

Откуда:
Сообщений: 88
i.varcount int, i.shiftindex money
Для каждой даты набор i.varcount = const
Например
varcount
5
10
10
10
10
------------
45
в свою очередь:
shiftindex
-----------
1.67
1.67
1.67
1.67
1.67
-----------
45*1.67 = 75.15 Round = 75
11 фев 04, 15:13    [531148]     Ответить | Цитировать Сообщить модератору
 Re: Непонятно с Group By  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
А без групптровки оба отчета вернут одинаковое число строк?
11 фев 04, 15:15    [531153]     Ответить | Цитировать Сообщить модератору
 Re: Непонятно с Group By  [new]
MiCe
Member

Откуда: RUSSIA STAVROPOL Pyatigorsk
Сообщений: 1996
работать с копейками.... или округлять так...
Sum(Round(i.varcount , 0, 1) * Round(i.shiftindex, 0, 1))
-------------------------------------
никогда не говорю никогда....
11 фев 04, 15:16    [531158]     Ответить | Цитировать Сообщить модератору
 Re: Непонятно с Group By  [new]
mao04
Member

Откуда:
Сообщений: 88
2Алексей2003
Спасибо щас попробую..
11 фев 04, 15:16    [531160]     Ответить | Цитировать Сообщить модератору
 Re: Непонятно с Group By  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
declare @t1 table (id int, numb decimal(10,2))


declare @i int, @i2 int
select @i = 0, @i2 = 0
while @i<9 begin
select @i2 = 0
while @i2 < 45 begin
insert into @t1 values (@i, 1.67)
select @i2=@i2+1
end
select @i=@i+1
end

select id, round(sum(numb),0,1) from @t1 group by id
select sum(round(numb,0,1)) from (select id, round(sum(numb),0,1) numb from @t1 group by id) a



для спящего время бодрствования равносильно сну
11 фев 04, 15:17    [531163]     Ответить | Цитировать Сообщить модератору
 Re: Непонятно с Group By  [new]
mao04
Member

Откуда:
Сообщений: 88
2MiCe
Sum(Round(i.varcount , 0, 1) * Round(i.shiftindex, 0, 1)) As monthsumma = 405

2tpg
Ну да по одной строке = 676
С группировкой по 9 -> 75*9
11 фев 04, 15:25    [531191]     Ответить | Цитировать Сообщить модератору
 Re: Непонятно с Group By  [new]
mao04
Member

Откуда:
Сообщений: 88
Спасибо всем за участие и отдельно Алексей2003
Решение действительно такое:

Select
fio,
tabnum,
monthplus, monthminus, Sum(monthsumma) As monthsumma,
polygplus, polygminus, polygsumma, idstaff, idsubdiv
From
(Select Rtrim(s.firstname)+' '+Rtrim(s.lastname)+' '+Rtrim(s.subname)+' ' As fio,
s.tabnum,
monthplus = Null, monthminus = Null, Round(Sum(i.varcount * i.shiftindex),0,1) As monthsumma,
polygplus = Null, polygminus = Null, polygsumma = Null, IsNull(s.idstaff,0) As idstaff, idsubdiv
From
staff s, staffindex i
Where i.idstaff = s.idstaff
And Year(i.datefixing) = 2004
And Month(i.datefixing) = 1
And s.tabnum = 5390
Group By s.firstname, s.lastname, s.subname, s.tabnum, s.idstaff, i.idsubdiv, i.datefixing) a
Group By fio, tabnum, idstaff, idsubdiv, polygplus, polygminus, polygsumma, monthplus, monthminus
-----------------------------------
Select
i.idstaff, i.idsubdiv,
i.datefixing,
s.tabnum, s.firstname, s.lastname, s.subname,
Round(Sum(i.varcount * i.shiftindex), 0, 1) As varcount,
flag =
Case When i.flagcompl = 0 Then 'Да' Else 'Нет' End,
i.shiftindex
From staff s, staffindex i
Where i.idstaff = s.idstaff
And Year(i.datefixing) = 2004
And Month(i.datefixing) = 1
And s.tabnum = 5390
Group By
i.idstaff, i.idsubdiv,
i.datefixing,
s.tabnum, s.firstname, s.lastname, s.subname,
i.flagcompl, i.shiftindex
11 фев 04, 15:59    [531306]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить