СОЕДИНЕНИЕ двух подзапросов с вычисляемыми полями - PullRequest
0 голосов
/ 31 января 2020

У меня есть две таблицы, содержащие информацию о производстве двух виджетов. Table1 выглядит так:

c

Таблица2 выглядит следующим образом:

enter image description here

Я хочу рассчитать среднее производство каждого виджета и отобразить его по коду страны (ADM0_A3), чтобы результаты выглядели примерно так (не то, чтобы на этих этапах отсутствовали данные, например, BWA не производит widget1)

ADM0_A3   w1avg   w2avg
DZA      50000  3450000
AGO      86000    40000
BWA      blank        0
CMR       3500    blank

Используемый мной запрос MS ACCESS SQL находится здесь:

SELECT Z.ccode, Z.ave_w1, A.ave_w2 
FROM 
(
    SELECT X.ADM0_A3 as ccode, 0.02 * X.sum_w1 / X.n_w1 AS ave_w1 
    FROM 
    (
        SELECT t1.ADM0_A3, SUM(t1.production) AS sum_w1, COUNT(t1.production) as n_w1 
        FROM Table1 t1
        GROUP BY t1.ADM0_A3
    ) X
) Z
JOIN
( 
    SELECT Y.ADM0_A3, 0.025 * Y.sum_w2 / Y.n_w2 AS ave_w2
    FROM 
    (
        SELECT t2.ADM0_A3, SUM(t2.production) AS sum_w2, COUNT(t2.production) as n_w2 
        FROM Table2 t2
        GROUP BY t2.ADM0_A3
    ) Y
) A
ON A.ADM0_A3 = Z.ccode

Я проверил подзапросы, и они работают нормально. Однако, когда я пытаюсь присоединиться к запросам, я получаю это сообщение об ошибке "Syntax error in FROM clause". Я думаю, что решение довольно простое, но я просто не вижу его, поэтому буду признателен за любые предложения. Заранее спасибо!

1 Ответ

1 голос
/ 31 января 2020

Вы можете попробовать сделать это:

SELECT adm0_a3, MAX(w1avg) as w1avg, MAX(w2avg) as w2avg
FROM (SELECT t1.ADM0_A3, AVG(t1.production) * 0.02 as w1avg, NULL as w2avg
      FROM Table1 as t1
      GROUP BY t1.ADM0_A3
      UNION ALL
      SELECT t2.ADM0_A3, NULL, AVG(t2.production) * 0.02 as w1avg
      FROM Table1 as t2
      GROUP BY t2.ADM0_A3
     ) as t
GROUP BY adm0_a3;

Я не уверен, что все версии MS Access поддерживают UNION ALL в предложении FROM. Если нет, вы можете обойти это, используя представление.

...