Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Новый топик    Ответить
 Сумма значений полей уникальных записей  [new]
Semen Popov
Member

Откуда: Сыктывкар
Сообщений: 793
Здравствуйте всем!
Обстановка: IBM DB2
Есть таблица T1 (F1 INTEGER NOT NULL, F2 REAL NOT NULL), в которой записи по TRNID могут повторяться. Например,
F1 F2
--------------
1 10.00
1 15.00
2 30.00
3 20.00
3 25.00

Нужно построить такой запрос, который бы подсчитывал сумму значений F2 только для уникальных по F1 записей. Если записей по F1 более одной, то суммировать значение F2 только первой из них. Т.е. по примеру должно получиться 10+30+20=60.

Помогите неопытному. А то я уже несколько вариантов испробовал, но запросы какими-то громоздкими получаются.

Спасибо
С уважением, Семен Попов
6 июн 07, 15:07    [4237248]     Ответить | Цитировать Сообщить модератору
 Re: Сумма значений полей уникальных записей  [new]
Semen Popov
Member

Откуда: Сыктывкар
Сообщений: 793
Semen Popov
в которой записи по TRNID могут повторяться.

Извините. Записи по F1 могут повторяться.
6 июн 07, 15:10    [4237262]     Ответить | Цитировать Сообщить модератору
 Re: Сумма значений полей уникальных записей  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4946
Здравствуйте.
select sum(f2)
from
(
select f2, rownumber() over(partition by f1) rn
from t1
) a
where rn=1;
В данном случае "1-я из них" будет выбираться случайно в общем случае, т.к. в db2 нет понятия "первая" или "последняя" запись.
Но вы можете внутри каждой группы F1 задавать сортировку записей, согласно которой они будут нумероваться.
6 июн 07, 15:24    [4237416]     Ответить | Цитировать Сообщить модератору
 Re: Сумма значений полей уникальных записей  [new]
Semen Popov
Member

Откуда: Сыктывкар
Сообщений: 793
Спасибо. То, что надо.
А можно ли одним запросом из таблицы T1 (F1 INTEGER NOT NULL, F2 REAL NOT NULL, F3 REAL NOT NULL) вычислить:
1. количество уникальных записей по F1,
2. сумму значений F2 уникальных записей по F1 (это я спрашивал выше),
3. сумму значений F3 всех записей?

Как все в отдельности, я теперь знаю. А можно ли в одном запросе?
6 июн 07, 16:02    [4237763]     Ответить | Цитировать Сообщить модератору
 Re: Сумма значений полей уникальных записей  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4946
with a as
(
select f2, rownumber() over(partition by f1) rn
from t1
)
select *
from table (
values
(
  (select count(1) from (select 1 from t1 group by f1 having count(1)=1) b)
, (select sum(f2) from a where rn=1)
, (select sum(f3) from t1)
) 
) b (v1, v2, v3)
6 июн 07, 16:24    [4237956]     Ответить | Цитировать Сообщить модератору
 Re: Сумма значений полей уникальных записей  [new]
Semen Popov
Member

Откуда: Сыктывкар
Сообщений: 793
Премного благодарен
6 июн 07, 16:33    [4238045]     Ответить | Цитировать Сообщить модератору
 Re: Сумма значений полей уникальных записей  [new]
Semen Popov
Member

Откуда: Сыктывкар
Сообщений: 793
Изобрел запрос на основе Вашего:
WITH a AS (SELECT TRNID FROM PENSTRAN.TRANSITS WHERE LAWRSLCOD<>1 AND PFRRSLCOD IN(1,2))
SELECT * FROM TABLE(VALUES(
(SELECT COUNT(*) FROM a),
(SELECT SUM(TICSUM) FROM PENSTRAN.TICKETS WHERE TRNID IN a),
(SELECT SUM(EXPNDLVRY) FROM PENSTRAN.TRANSITS WHERE TRNID IN a)
)) AS b(v1,v2,v3)
Но, он не работает. Что тут не так?
7 июн 07, 11:27    [4241282]     Ответить | Цитировать Сообщить модератору
 Re: Сумма значений полей уникальных записей  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4946
Semen Popov
Изобрел запрос на основе Вашего:
WITH a AS (SELECT TRNID FROM PENSTRAN.TRANSITS WHERE LAWRSLCOD<>1 AND PFRRSLCOD IN(1,2))
SELECT * FROM TABLE(VALUES(
(SELECT COUNT(*) FROM a),
(SELECT SUM(TICSUM) FROM PENSTRAN.TICKETS WHERE TRNID IN a),
(SELECT SUM(EXPNDLVRY) FROM PENSTRAN.TRANSITS WHERE TRNID IN a)
)) AS b(v1,v2,v3)
Но, он не работает. Что тут не так?

Фразу
"IN a"
заменить на
"IN (SELECT TRNID FROM a)"
7 июн 07, 11:40    [4241371]     Ответить | Цитировать Сообщить модератору
 Re: Сумма значений полей уникальных записей  [new]
Semen Popov
Member

Откуда: Сыктывкар
Сообщений: 793
Mark Barinstein

Фразу
"IN a"
заменить на
"IN (SELECT TRNID FROM a)"

Спасибо. Учиться мне еще и учиться!
7 июн 07, 11:47    [4241424]     Ответить | Цитировать Сообщить модератору
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Ответить