将其他表达式列添加到交叉表-这可能吗?

时间:2019-05-14 16:09:28

标签: sql ms-access crosstab

我有一个交叉表,按月和年汇总平均值。剩下的唯一组件是计算两个agg之间的价差。功能列。用户可以选择他们要查看其价差的两个节点。用户还可以选择年份。

代码如下:

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.   
  3. 节点2:6789
  4.   
  5. 年份:2017
  6.   

将显示以下内容:

月份----------------年份----------- 12345 -------------- 6789

2017年1月------------------- 10 --------------- --20

2017年2月----------------- 15 -------------- --15

2017年3月----------------- 5 ---------------- -0

2017年4月----------------------------- 20 --------------- --10

问题

如何添加一列,以使我能在两个选定节点之间分布?看起来像这样:

月份----------------年份----------- 12345 -------------- 6789 ---- ---------传播

2017年1月------------------- 10 --------------- --20 ----------------(-10)

2017年2月----------------- 15 -------------- --15 -----------------(0)

2017年3月----------------- 5 ---------------- -0 ------------------(5)

2017年4月----------------------------- 20 --------------- --10 ---------------(10)

我相当确定这是不可能的,但是我想用尽所有资源。或者,如果还有其他选择。

1 个答案:

答案 0 :(得分:0)

考虑使用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;