简短问题:
是否有一种简单的方法可以在原始sql中以整齐的行和列显示聚合值表?防爆。选定年份的总销售额,其中列名称为年份,行单元格为总计。
2005 2006 2007
--------------------------
Gary $500 $1000 $2000
Joe $500 $500 $500
背景:
我有一组我不断报告的数据。我的工作有BI工具,对于某些类型的报告,它们非常有用,但它们也有点笨拙且相当不灵活。 BI工具的另一个问题是,获取非常精美的自定义格式化报告非常困难,所以我最终做的很多就是编写报告,获取输出,将其移动到Microsoft Office套件中,然后执行更多格式化。只要有可能,我更喜欢运行原始sql,因为它更容易记录,我可以手动将值复制并粘贴到excel中,这通常比编写BI报告花费的时间更少。
有时我必须创建聚合数据表,其中,出于纯粹的美观原因,列和行只是松散地相互关联。我经常需要做一些与数据相当复杂的事情,以便将所有信息组合在一起。我最终在SQL服务器上编写的代码非常冗长,笨重,效率低下,但有效:
示例:
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中,有更好的方法吗?
答案 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
这样,您的临时表将持续与当前会话一样长。