首先我想提一下,如果这是为了在 Web 界面或报告中进行演示,您可以使用求和进行更简单的分组查询,然后简单地将数据片段移动到需要的位置。例如,您可以在 [Total_Amount] 之后开始一个新的 HTML 行,并插入 4 个空单元格,然后是下一个小计,等等,创建所需的表格结构。
-- it appears this query contains everything you are asking for, but not using the same 'tabular structure.'
SELECT
name
,MONTH([MyDate]) AS [MonthNumber]
,DATENAME(MONTH, [MyDate]) AS [MONTH]
,YEAR([MyDate]) AS [YEAR]
,SUM(Amount) AS [Total_Amount]
,SUM(Retailfee) AS [Total_Retailfee] -- move down one row
,SUM(Transactions) AS [Total_Transactions] -- move down two rows
FROM #temp
GROUP BY
name
,MONTH([MyDate])
,DATENAME(MONTH, [MyDate])
,YEAR([MyDate]
您似乎希望在查询中为数据集中的每个 [name] 和 [MONTH] 组合返回三行。如果是这样,这里有一个解决方案,它使用一个设置来创建一些示例数据和一个派生表来根据需要提取它:
-- I find that providing example data help to get more accurate results for some queries
CREATE TABLE #temp (
name VARCHAR(20)
,MyDate DATE
,Amount DECIMAL(8,4)
,Retailfee DECIMAL(8,4)
,Transactions DECIMAL(8,4)
);
-- no idea what these values actually mean so the data may not make sense.
INSERT #temp VALUES ('Spar Group','01/01/2013',1000.00,163.55,200.00)
INSERT #temp VALUES ('Spar Group','01/02/2013',40.00,0.11,2.00)
INSERT #temp VALUES ('Spar Group','01/03/2013',299.99,35.00,33.00)
INSERT #temp VALUES ('Spar Group','02/03/2013',145.99,0.00,7.00)
INSERT #temp VALUES ('Shoprite','01/01/2013',22.99,0.00,8.00)
INSERT #temp VALUES ('Shoprite','01/02/2013',149.95,16.60,11.50)
SELECT
name
,[MonthNumber]
,[MONTH]
,[YEAR]
,[Category]
,[CategoryTotal]
FROM (
-- select the first row for each [name],[month] group
SELECT
name
,MONTH([MyDate]) AS [MonthNumber]
,DATENAME(MONTH, [MyDate]) AS [MONTH]
,YEAR([MyDate]) AS [YEAR]
,'Total_Amount' AS [Category]
,SUM(Amount) AS [CategoryTotal]
FROM #temp
GROUP BY
name
,MONTH([MyDate])
,DATENAME(MONTH, [MyDate])
,YEAR([MyDate])
UNION ALL
-- select the second row for each [name],[month] group
SELECT
name
,MONTH([MyDate]) AS [MonthNumber]
,DATENAME(MONTH, [MyDate]) AS [MONTH]
,YEAR([MyDate]) AS [YEAR]
,'Total_Retailfee' AS [Category]
,SUM(Retailfee) AS [CategoryTotal]
FROM #temp
GROUP BY
name
,MONTH([MyDate])
,DATENAME(MONTH, [MyDate])
,YEAR([MyDate])
UNION ALL
-- select the third row for each [name],[month] group
SELECT
name
,MONTH([MyDate]) AS [MonthNumber]
,DATENAME(MONTH, [MyDate]) AS [MONTH]
,YEAR([MyDate]) AS [YEAR]
,'Total_Transactions' AS [Category]
,SUM(Transactions) AS [CategoryTotal]
FROM #temp
GROUP BY
name
,MONTH([MyDate])
,DATENAME(MONTH, [MyDate])
,YEAR([MyDate])
) AS T
ORDER BY
name, [MONTH], [YEAR]
,CASE
WHEN [Category]='Total_Amount' THEN 1
WHEN [Category]='Total_Retailfee' THEN 2
ELSE 3
END