Sai*_*han 1 sql sql-server sql-server-2000
我有一个生产表,每个月有12列.我需要创建一个SP,我传入productID,Customer和Month参数并检索该月的总和.
目前我的逻辑是
if month = 1 then
select sum(JAN) from table where productID = @id and customer = @cust
if month = 2 then
select SUM(FEB) from table where productID = @id and customer = @cust
....
Run Code Online (Sandbox Code Playgroud)
查询涉及更多,但这是它的核心.围绕这些"IF"声明有什么办法吗?
编辑 - 这是一个SQL Server 2000数据库,但将迁移到SQL Server 2005,当我迁移到SQL Server 2005时,PIVOT和UNPIVOT将派上用场.
我认为查询的难度源于您的数据库未正确规范化的事实.
您似乎有一个包含列的表:
productId
customer
JAN
FEB
...
Run Code Online (Sandbox Code Playgroud)
无论是在存储过程中还是在存储过程中,您都创建了一个看起来像这样的临时表.这不是在SQL中执行此操作的最佳方法.您的目标应该是像这样的表结构:
productId
customer
date
amount
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用简单的WHERE子句编写查询:
SELECT SUM(amount)
FROM table
WHERE MONTH(date) = month AND productID = @id and customer = @cust
Run Code Online (Sandbox Code Playgroud)
您可能还想查询查询中的年份,否则您可能会对2009年1月和2010年1月的数据进行求和.或者......也许您每年都有一张表格?(我希望不是!)
注意:当然,此时更改表结构可能实际上并不可行.我还是觉得如果你不知道这个问题,这值得一提.至少知道这一点可能会防止将来再犯同样的错误.
看一下UNPIVOT- 你会想要将列分成行,然后使用一个WHERE子句来获取你感兴趣的月份的行.
内:
SELECT *
FROM tbl UNPIVOT FOR Month IN ([JAN], [FEB], etc...)
Run Code Online (Sandbox Code Playgroud)
然后加入表格将月份翻译为数字:JAN 1 FEB 2 etd.
然后 WHERE MonthNum = @param
| 归档时间: |
|
| 查看次数: |
1013 次 |
| 最近记录: |