创建聚合值表的最佳方法SQL

时间:2015-07-29 22:05:14

标签: sql sql-server

简短问题:

是否有一种简单的方法可以在原始sql中以整齐的行和列显示聚合值表?防爆。选定年份的总销售额,其中列名称为年份,行单元格为总计。

     2005    2006    2007
--------------------------
Gary $500    $1000  $2000
Joe  $500    $500   $500

背景:

我有一组我不断报告的数据。我的工作有BI工具,对于某些类型的报告,它们非常有用,但它们也有点笨拙且相当不灵活。 BI工具的另一个问题是,获取非常精美的自定义格式化报告非常困难,所以我最终做的很多就是编写报告,获取输出,将其移动到Microsoft Office套件中,然后执行更多格式化。只要有可能,我更喜欢运行原始sql,因为它更容易记录,我可以手动将值复制并粘贴到excel中,这通常比编写BI报告花费的时间更少。

有时我必须创建聚合数据表,其中,出于纯粹的美观原因,列和行只是松散地相互关联。我经常需要做一些与数据相当复杂的事情,以便将所有信息组合在一起。我最终在SQL服务器上编写的代码非常冗长,笨重,效率低下,但有效:

  1. 我创建了一个表变量
  2. 我编写了一个语句,使用一系列sum / case语句
  3. 选择表的一行
  4. 我将每个select语句逐个插入临时表并显示表。
  5. 示例:

    DECLARE @Temp AS TABLE(
     ord int --I can use an ORDER BY clause against this to make sure the rows display in the correct order
    ,"2004-2005" INT
    ,"2005-2006" INT
    ,"2006-2007" INT
    ,"2007-2008" INT
    ,"2008-2009" INT
    ,"2009-2010" INT
    ,"2010-2011" INT
    ,"2011-2012" INT
    ,"2012-2013" INT
    ,"2013-2014" INT
    )
    
    INSERT INTO @Temp
    Select
    1
    ,SUM(CASE WHEN something = 'blah' THEN 1 ELSE 0 END) AS '2004-2005'
    --similar code here
    WHERE whatever = something
    
    Select * FROM @temp ORDER BY ord
    

    所以我的问题是,在SQL中,有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

为简化起见,您可以尝试:

SELECT 1
       ,SUM(CASE WHEN something = 'blah' THEN 1 ELSE 0 END) AS '2004-2005'
       --similar code here
INTO #temp
FROM YourTable
WHERE whatever = something 


SELECT * FROM #temp

这样,您的临时表将持续与当前会话一样长。