Добавить дополнительный столбец выражения кросс-таблицы - это возможно? - PullRequest
1 голос
/ 14 мая 2019

У меня есть кросс-таблица, которая агрегирует значения по месяцам и годам как средние значения. Единственный оставшийся компонент - это расчет спреда между двумя значениями. столбцы функций. Пользователь может выбрать два узла, в которых он хочет видеть спреды. Пользователь также может выбрать год.

Вот код:

PARAMETERS [Node 1] Long, [Node 2] Long, [Year] Long;
TRANSFORM Format(Avg([Monthly values].[total_lmp_on]),"Fixed") AS AVG_ON_LMP
SELECT [Monthly values].Month, [Monthly values].Year
FROM [Monthly values]
WHERE ((([Monthly values].pnode_id)=[Node 1] Or ([Monthly values].pnode_id)=[Node 2])AND [Monthly values].Year = [Year])
GROUP BY [Monthly values].Month, [Monthly values].Year
PIVOT [Monthly values].pnode_id;

Пользователю предлагается Узел 1, Узел 2 и год. Скажем:

  1. Узел 1: 12345
  2. Узел 2: 6789
  3. Год: 2017

Будет показано следующее:

Месяц -------------- Год ----------- -------------- 12345 6789

Jan ----------------- 2017 ------------ 10 --------------- --20

Февраль ----------------- 2017 ------------ 15 --------------- --15

Март 2017 ---------------- ------------ 5 ---------------- -0

Апрель ----------------- 2017 ------------ 20 --------------- --10

проблема

Как я могу добавить столбец, который даст мне разброс между двумя выбранными узлами? Который будет выглядеть так:

Месяц -------------- Год ----------- -------------- 12345 6789 ---- --------- Spread

Jan ----------------- 2017 ------------ 10 --------------- --20 ---------------- (- 10)

Февраль ----------------- 2017 ------------ 15 --------------- --15 ----------------- (0)

Март 2017 ---------------- ------------ 5 ---------------- -0 ------------------ (5) * +1040 *

Апрель ----------------- 2017 ------------ 20 --------------- --10 --------------- (10) * * тысяча сорок два

Я вполне уверен, что это невозможно, но хотел бы исчерпать все ресурсы. Или, если есть какие-либо другие варианты.

1 Ответ

0 голосов
/ 14 мая 2019

Рассмотрим условное агрегирование, используя AVG(IIF(...)), чтобы найти разницу средних значений для соответствующих узлов. Обратите внимание: столбец Spread появится справа от поворотных столбцов.

PARAMETERS [Node 1] Long, [Node 2] Long, [Year] Long;
TRANSFORM Format(AVG(m.[total_lmp_on]), "Fixed") AS AVG_ON_LMP
SELECT m.Month, m.Year,
       AVG(IIF(m.pnode_id = [Node1], m.[total_lmp_on], NULL)) -  
       AVG(IIF(m.pnode_id = [Node2], m.[total_lmp_on], NULL)) AS Spread
FROM [Monthly values] m
WHERE (m.pnode_id) IN ([Node 1], [Node 2]) AND (m.Year = [Year])
GROUP BY m.Month, m.Year
PIVOT m.pnode_id;
...