如何显示SQL Server表的合并版本?

时间:2011-01-11 23:06:05

标签: sql sql-server

考虑SQL Server数据库的这种简化方案。这不完全是我的表格构建方式,但这个例子足以满足我的需要。

我有一个带有主键的产品表,比方说IdProduct和其他一些列,例如产品名称和说明。

然后我有一个类似于每月总销售额的表(SalesPerMonth)。第二个表包含一些字段:

IdMonthlySale (key)
IdProduct (foreign key to the main table)
TotalSales (money)
Monthy (int or smallint)
Year (int or smallint)

第二张表将保留详细信息。我们可以通过SELECT * FROM SalesPerMonth WHERE ProductId = xx

跟踪特定产品的销售情况

但是,假设我想显示这些数据,就好像它没有标准化一样。我想要一个平面的产品X月/年表,显示过去8个月。或多或少像这样:

  Prod     *  Jan  *  Feb  *  Mar  *  Apr  *  May  *  Jun  *  Jul  *  Aug  *
-----------------------------------------------------------------------------
Prod 1     * 500.00* 480.00* 470.00* 510.00* 555.00* 530.00* 440.00* 490.00*
-----------------------------------------------------------------------------
Prod 2     * 650.00* 680.00* 670.00* 710.00* 755.00* 630.00* 740.00* 820.00*

好。我希望你明白这个主意。我需要压缩生成的表,我需要以这种方式输出给我的用户。我怎么能做到这一点?

1 个答案:

答案 0 :(得分:1)

从SQL Server 2005开始,您可以使用PIVOT来执行此操作

在SQL 2000中,您可以使用一系列CASE语句,例如

SELECT 
   SUM(CASE WHEN Month = 1 THEN Value ELSE 0 END ) as Jan,
   SUM(CASE WHEN Month = 2 THEN Value ELSE 0 END ) as Feb,

如果您不关心字段名称,可以使用偏移输入。

DECLARE @CurrentMonth = @Input;
DECLARE @CurrentMonth1 = @Input -1;
DECLARE @CurrentMonth2 = @Input -2;

然后关闭那个

的SUM / CASE
   e.g.  
       SUM(CASE WHEN Month = @CurrentMonth  THEN Value ELSE 0 END ) as Month0,
       SUM(CASE WHEN Month = @CurrentMonth1 THEN Value ELSE 0 END ) as Month1,

然后在您的显示(报告/应用程序)中,您将解决列为标题的内容