2013-08-27 2 views
0

Получил две таблицы: «saldos_one» и «saldos_two», обе таблицы получили следующие поля: CLIENTID, DATE, VALUE.Объединить результаты и выполнить среднее арифметическое

Я должен получить среднее арифметическое значение TOTAL из среднего арифметического для каждого CLIENTID за несколько периодов времени.

Давайте несколько примеров:

> SELECT * FROM saldos_one; 
+----------+------------+---------+ 
| CLIENTID | DATE  | VALUE | 
+----------+------------+---------+ 
| 1  | 2009-08-01 | 1000.00 | 
| 1  | 2009-09-01 | 2000.00 | 
| 1  | 2009-10-01 | 3000.00 | 
| 2  | 2009-08-01 | 1000.00 | 
| 2  | 2009-09-01 | 2000.00 | 
| 2  | 2009-10-01 | 3000.00 | 
| 3  | 2009-08-01 | 1000.00 | 
| 3  | 2009-09-01 | 2000.00 | 
| 3  | 2009-10-01 | 3000.00 | 
| 4  | 2009-08-01 | 1000.00 | 
| 4  | 2009-09-01 | 2000.00 | 
| 4  | 2009-10-01 | 3000.00 | 
+----------+------------+---------+ 

> SELECT * FROM saldos_two; 
+----------+------------+---------+ 
| CLIENTID | DATE  | VALUE | 
+----------+------------+---------+ 
| 1  | 2009-08-01 | 10.00 | 
| 1  | 2009-09-01 | 20.00 | 
| 1  | 2009-10-01 | 30.00 | 
| 2  | 2009-08-01 | 100.00 | 
| 2  | 2009-09-01 | 200.00 | 
| 2  | 2009-10-01 | 300.00 | 
| 3  | 2009-08-01 | 1000.00 | 
| 3  | 2009-09-01 | 2000.00 | 
| 3  | 2009-10-01 | 3000.00 | 
| 5  | 2009-08-01 | 1.00 | 
| 5  | 2009-09-01 | 2.00 | 
| 5  | 2009-10-01 | 3.00 | 
+----------+------------+---------+ 

После QUERY среднего арифметическое для каждой таблицы:

> SELECT CLIENTID, TRUNCATE(SUM(VALUE)/COUNT(VALUE), 2) 
FROM saldos_one 
WHERE (DATE BETWEEN '2009-08-01' AND '2009-10-01') 
GROUP BY CLIENTID; 
+----------+---------+ 
| CLIENTID | VALUE | 
+----------+---------+ 
| 1  | 2000.00 | 
| 2  | 2000.00 | 
| 3  | 2000.00 | 
| 4  | 2000.00 | 
+----------+---------+ 

> SELECT CLIENTID, TRUNCATE(SUM(VALUE)/COUNT(VALUE), 2) 
FROM saldos_two 
WHERE (DATE BETWEEN '2009-08-01' AND '2009-10-01') 
GROUP BY CLIENTID; 
+----------+---------+ 
| CLIENTID | VALUE | 
+----------+---------+ 
| 1  | 20.00 | 
| 2  | 200.00 | 
| 3  | 2000.00 | 
| 5  | 2.00 | 
+----------+---------+ 

То, что я хотел бы получить этот арифметическое средство для каждого клиента с арифметическим разными таблицы, которые будут:

+----------+---------+ 
| CLIENTID | VALUE | 
+----------+---------+ 
| 1  | 1010.00 | = 2000.00 + 20.00/2 
| 2  | 200.00 | = 200.00 + 200.00/2 
| 3  | 2000.00 | = 2000.00 + 2000.00/2 
| 4  | 1000.00 | = 2000.00 + 0/2 
| 5  | 1.00 | = 2.00 + 0/2 
+----------+---------+ 

РЕШЕНИЕ: См. ответ @ bvr

ответ

3

Попробуйте

SELECT CLIENTID,SUM(VALUE)/2 VALUE FROM 
(
    SELECT CLIENTID, TRUNCATE(SUM(VALUE)/COUNT(VALUE), 2) VALUE 
    FROM saldos_one 
    WHERE (DATE BETWEEN '2009-08-01' AND '2009-10-01') 
    GROUP BY CLIENTID; 
    UNION ALL 
    SELECT CLIENTID, TRUNCATE(SUM(VALUE)/COUNT(VALUE), 2) VALUE 
    FROM saldos_two 
    WHERE (DATE BETWEEN '2009-08-01' AND '2009-10-01') 
) t 
GROUP BY CLIENTID 
+0

Это отлично работает! Большое спасибо – Wolfchamane

0

Вы можете использовать функцию AVG вместо SUM (VALUE)/COUNT (VALUE).

О заключительной части Вашего вопроса:

Вы можете поместить во временную таблицу результат двух запросов, а затем применить к временной таблице тот же запрос с помощью функции AVG, поэтому применяется среднее между двумя значениями (2000 и 20).

И все строки вашей таблицы

1

Вы можете использовать UNION таблиц, а затем выполнить свой анализ на них.

E.g.

SELECT CLIENTID, AVG(VALUE) FROM (
    SELECT CLIENTID, VALUE FROM saldos_one WHERE 
     (DATE BETWEEN '2009-08-01' AND '2009-10-01') 
    UNION 
    SELECT CLIENTID, VALUE FROM saldos_two WHERE 
     (DATE BETWEEN '2009-08-01' AND '2009-10-01') 
) t 
GROUP BY CLIENTID 
+0

Ваш AVG не подойдет, если идентификатор клиента отсутствует в одной из таблиц. В вопросе говорится, что недостающее значение следует рассматривать как 0. – Barmar

+0

Вы правы, я пропустил это. Похоже, что только ответ 'bvr' учитывает это ... –

1
select CLIENTID, TRUNCATE(SUM(VALUE)/COUNT(VALUE), 2) from 
(SELECT CLIENTID, TRUNCATE(SUM(VALUE)/COUNT(VALUE), 2) as VALUE 
FROM saldos_one 
WHERE (DATE BETWEEN '2009-08-01' AND '2009-10-01') 
GROUP BY CLIENTID 
union all 
SELECT CLIENTID, TRUNCATE(SUM(VALUE)/COUNT(VALUE), 2) 
FROM saldos_two 
WHERE (DATE BETWEEN '2009-08-01' AND '2009-10-01') 
GROUP BY CLIENTID) as A group by A.CLIENTID