2013-01-17 34 views
3

我正在尝试创建一个将生成下表的查询。 我知道列名称(即每列的开始日期和结束日期,这些日期会根据月份/年份而变化,并且列数也会有所不同,因为某些月份可能会有6周)。sql - 创建单个查询以获取给定条件的值

池的数量也可能有所不同。可以有'n'个池。所以我创建了每个池(行)和每周(列)的查询。
假设有3个池(3行)和5个星期(5列),我可能需要运行3 * 5 = 15个查询。
有什么办法来创建一个单一的查询来解决这个问题吗?
任何人都可以帮助我解决这个问题吗?
我stiil工作这个..

-------------------------------------------------- 
row 0 | week1 | week2 | week3 | week4 | week5 | 
st-end|jan1 -2|jan 3-9|jan10-17|jan18-24|jan25-31| 
-------------------------------------------------- 
pool a| 100 | 105 | 309 | 345 | 234 | 
pool b| 106 | 108 | 399 | 245 | 214 | 
pool c| 120 | 145 | 359 | 365 | 274 | 
-------------------------------------------------- 
+1

这不是回答你的问题,只是评论...一般是什么样的情形中,我更喜欢从SQL切换到命令式编程(Java)。您可以创建一个准备好的语句,用于计算一个通用的“单元”,然后针对15个单元中的每一个执行它(通过改变某些参数)。没有什么不好的,你在15分钟内就完成了。如果计算和/或查询很昂贵,则可以缓存结果表。在SQL中执行所有这些操作可能变得棘手并且难以被其他人阅读/理解。 – gd1

+2

如果没有看到要查询的表以创建表(结果集),则表明无法说明查询应该是什么。 –

+0

@NickHolt - 假设我试图得到('pool a'- week1),(pool a - week 2)等等的组合,并且这种情况会发生在所有池中,因此我认为需要运行15个查询。我只想检查是否可以运行单个查询。 – user1514499

回答

1

您是否尝试过使用CASE表达式来做到这一点? [见“控制流程函数”]沿着这些线路 东西:

select POOL 
     ,sum(case when dt between 20120101 and 20120107 then VAL else 0) as Wk1 
     ,sum(case when dt between 20120108 and 20120114 then VAL else 0) as Wk2 
    ... ... 
from MY_TABLE 
group by POOL