考虑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*
好。我希望你明白这个主意。我需要压缩生成的表,我需要以这种方式输出给我的用户。我怎么能做到这一点?
答案 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,
然后在您的显示(报告/应用程序)中,您将解决列为标题的内容