如何强制Total Column在TRANSFORM SQL语句中最后出现

时间:2015-11-30 17:43:17

标签: sql ms-access pivot transform

我有以下SQL语句来创建摘要视图

TRANSFORM Sum(Amount) AS CurrAmount 
SELECT Currency, Sum(Amount) AS TotalAmount 
From MyTable 
GROUP BY Currency
ORDER BY Currency 
PIVOT Source

它会创建以下视图

Currency    TotalAmount Retail  Corporate     Others
EUR               7,071    585      2,345      4,141
GBP              10,444  2,322      4,889      3,233
JPY               7,050  1,295      4,500      1,255
USD               1,625    250        450        925

我正在寻求帮助,其中我需要' TotalAmount'字段显示为最后一列。非常感谢

NIZ

2 个答案:

答案 0 :(得分:1)

我认为您对列排序/序列的要求可以由IN运算符支持的TRANSFORM子句处理。看看这个:

TRANSFORM <aggregate-function-expression>
    <select-statement>
PIVOT <expression>
[IN (<column-value-list>)]

其中<aggregate-function-expression>是使用其中一个聚合函数创建的表达式,<select-statement>包含GROUP BY子句,<column-value-list>是预期返回的必需值列表通过PIVOT表达式,用引号括起来并用逗号分隔。 (您可以使用IN子句强制列的输出序列。)

换句话说,只需使用IN并按所需顺序放置以引号/逗号分隔的列列表(例如IN ("Currency", "Retail", "Corporate", "Others", "TotalAmount")

对我来说似乎有点复杂,但它似乎得到了Access的支持。

注意:此信息来自以下文章: TRANSFORM Statement

答案 1 :(得分:0)

使用IN子句的解决方案在某种程度上可以完成工作但有时表现得很奇怪。而且,部门(零售,公司)对我来说并不固定。新部门不断涌现,因此每次都不能对其进行硬编码。我以更简单的方式解决了这个问题。

SELECT Currency,
(SELECT SUM(t1.Amount) FROM MyTable t1 WHERE t1.Source = 'Retail' AND t1.Curr = pos.Curr) Retail,
(SELECT SUM(t1.Amount) FROM MyTable t1 WHERE t1.Source = 'Corporate' AND t1.Curr = pos.Curr) Corporate,
(SELECT SUM(t1.Amount) FROM MyTable t1 WHERE t1.Source NOT IN ('Retail','Corporate') AND t1.Curr = pos.Curr) Others,
(SELECT SUM(t1.Amount) FROM MyTable t1 WHERE t1.Curr = pos.Curr) Total
FROM MyTable pos
GROUP BY Curr
ORDER BY Curr

即使在上面,如果有新的部门(出现在Others中),如果我需要指定,我将最终更改SQL,但仍然在我的控制之下,而不像TRANSFORM语句失控。 / p>

谢谢你们。