在 MS SQL Server 2008 的 Pivot 中计算水平总计

Posted

技术标签:

【中文标题】在 MS SQL Server 2008 的 Pivot 中计算水平总计【英文标题】:Calculating Horizontal Totals in Pivot in MS SQL Server 2008 【发布时间】:2013-01-29 17:31:28 【问题描述】:

我想知道如何计算行小计。

我的桌子是这样的:

FCode   DMAR15  DMAR02  DMAR13  DMAR06
F83006     292     334     111     152
F83025     272     298      80     140
F83048     166     179      56      57
F83049      27      32      15      17
F83050     105     112      45      53
F83635     139     153      41      41

我的脚本是:

SELECT [FCode],
       [DMAR15],
       [DMAR02],
       [DMAR13],
       [DMAR06],
       [PCVDR41],
       [PCVDR42],
       [CLDP031],
       [CLDP003],
       [CLDP012],
       [CLDP028],
       [CLDP023],
       [CLDP021],
       [CLDP016],
       [CLDP022]
FROM   (SELECT [FCode],
               [Aggregate],
               [QName]
        FROM   [dbo].[tblMiquestResults]
        WHERE  AuditDate = '2012-09-30') AS SourceTable 
PIVOT (AVG (Aggregate) FOR [QName] IN ([DMAR15], [DMAR02], [DMAR13], 
                                       [DMAR06], [PCVDR41], [PCVDR42], 
                                       [CLDP031], [CLDP003], [CLDP012], 
                                       [CLDP028], [CLDP023], [CLDP021], 
                                       [CLDP016], [CLDP022])) AS P 

我想让它看起来像这样:

FCode   DMAR15  DMAR02  DMAR13  DMAR06
F83006     292     334     111     152
F83025     272     298      80     140
F83048     166     179      56      57
F83049      27      32      15      17
F83050     105     112      45      53
F83635     139     153      41      41
Total     1001    1108     348     460

【问题讨论】:

您能否展示您的查询应该在其上运行的示例数据? “水平总计”有点不清楚;你的总数是水平的,但每个总数都是垂直的。 “一整行”不会那么模棱两可。 我正在尝试在数据透视表中包含总计。 是的,但一次可以跨越、向下或两者兼而有之。 bonCondigo 猜到您想要总计,这就是为什么我建议明确说“一排”。 【参考方案1】:

一种方法

SELECT CASE WHEN GROUPING([FCode]) = 1 THEN 'Total' ELSE [FCode] END AS [FCode],
       SUM([DMAR15]) AS DMAR15,
       SUM([DMAR02]) AS [DMAR02]
        /*TODO: Rest of columns*/
FROM   (SELECT [FCode],
               [Aggregate],
               [QName]
        FROM   [tblMiquestResults]) AS SourceTable 
PIVOT (AVG (Aggregate) FOR [QName] IN ([DMAR15], [DMAR02], [DMAR13], 
                                       [DMAR06], [PCVDR41], [PCVDR42], 
                                       [CLDP031], [CLDP003], [CLDP012], 
                                       [CLDP028], [CLDP023], [CLDP021], 
                                       [CLDP016], [CLDP022])) AS P 
GROUP BY GROUPING SETS ((FCode),())

SQL Fiddle

【讨论】:

【参考方案2】:

鉴于您的上表(不查看您的查询),以下是执行rowsum 的查询。

SQLFIDDLE DEMO

select a.fcode, a.DMAR15,  a.DMAR02,  
a.DMAR13,  a.DMAR06, (a.DMAR15 +  a.DMAR02 +
a.DMAR13 +  a.DMAR06) as RowSum
from demo a
;

|  FCODE | DMAR15 | DMAR02 | DMAR13 | DMAR06 | ROWSUM |
-------------------------------------------------------
| F83006 |    292 |    334 |    111 |    152 |    889 |
| F83025 |    272 |    298 |     80 |    140 |    790 |
| F83048 |    166 |    179 |     56 |     57 |    458 |
| F83049 |     27 |     32 |     15 |     17 |     91 |
| F83050 |    105 |    112 |     45 |     53 |    315 |
| F83635 |    139 |    153 |     41 |     41 |    374 |

【讨论】:

@KaisMalique Thsi 查询是非常基本的.. 所以如果您能详细说明您尝试应用于您自己的查询和预期结果的条件,那就太好了。 我正在尝试获取枢轴的水平小计。谢谢。

以上是关于在 MS SQL Server 2008 的 Pivot 中计算水平总计的主要内容,如果未能解决你的问题,请参考以下文章

在 MS SQL Server 2008 的 Pivot 中计算水平总计

将 php 连接到 MS SQL Server 2008

将表从 SQL Server 2008 复制到 MS Access 2007

MS SQL Server 2008 中的空值处理

从 SQL Server 2008 迁移到 MS access 2007

ODBC:用于 MS Access 的 SQL Server 2008 驱动程序