Simpilify查询SQL表,每月12列

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将派上用场.

Mar*_*ers 8

我认为查询的难度源于您的数据库未正确规范化的事实.

您似乎有一个包含列的表:

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月的数据进行求和.或者......也许您每年都有一张表格?(我希望不是!)


注意:当然,此时更改表结构可能实际上并不可行.我还是觉得如果你不知道这个问题,这值得一提.至少知道这一点可能会防止将来再犯同样的错误.


Cad*_*oux 6

看一下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

  • 我还建议使用UNPIVOT创建一个VIEW,以便您可以正确地进行查询. (2认同)