2012-08-28 35 views
1

嗨,我可能过于复杂化我的代码,所以寻找一个更好的方法。Transact SQL 2总结1查询使用案例

我有发票表,我比较我在寻找一个简单的SQL语句,将看日期2个日期范围是在范围1添加到别的ordertotal1如果日期范围为2加入ordertotal2

这是我尝试

SELECT  CUST_CODE, 

    CASE 
     WHEN ORDER_DATE >= CONVERT(DATETIME, '2011-01-01 00:00:00', 102) AND ORDER_DATE <= CONVERT(DATETIME, '2011-07-31 23:59:59', 102) THEN SUM(INV_AMOUNT) AS OrderTotal, SUM(PAID_AMT) AS paidTotal 
WHEN ORDER_DATE >= CONVERT(DATETIME, '2012-01-01 00:00:00', 102) AND ORDER_DATE <= CONVERT(DATETIME, '2012-07-31 23:59:59', 102) THEN SUM(INV_AMOUNT) AS OrderTotal2, SUM(PAID_AMT) AS paidTotal2 
    END 
    FROM   INVOICES 
    WHERE (STATUS = 9) 
    GROUP BY CUST_CODE 

当然这是真的错了,并引发了很多的错误, 我想我注定要在我的PHP运行几个查询来实现它,但我真的不确定我记得过去做过类似上面的事情。

仅供参考:在windows 2.2上运行php 5 Mssql 2000(不是由选择)在apache 2.2上。

感谢所有帮助提供

回答

1

看来,你CASE声明缺少END

SELECT CUST_CODE, 
    CASE 
     WHEN  ORDER_DATE >= CONVERT(DATETIME, '2011-01-01 00:00:00', 102) 
      AND ORDER_DATE <= CONVERT(DATETIME, '2011-07-31 23:59:59', 102) 
     THEN  SUM(INV_AMOUNT) END AS OrderTotal, 
     SUM(PAID_AMT) AS paidTotal, 
    CASE 
     WHEN  ORDER_DATE >= CONVERT(DATETIME, '2012-01-01 00:00:00', 102) 
      AND ORDER_DATE <= CONVERT(DATETIME, '2012-07-31 23:59:59', 102)   
     THEN SUM(INV_AMOUNT) END AS OrderTotal2 
    ---SUM(PAID_AMT) AS paidTotal2 not needed 
FROM         INVOICES 
WHERE (STATUS = 9) 
GROUP BY CUST_CODE 

或者更好的是:

SELECT CUST_CODE, 
    SUM(
     CASE 
     WHEN  ORDER_DATE >= CONVERT(DATETIME, '2011-01-01 00:00:00', 102) 
      AND ORDER_DATE <= CONVERT(DATETIME, '2011-07-31 23:59:59', 102) 
     THEN  INV_AMOUNT END) AS OrderTotal, 
     SUM(PAID_AMT) AS paidTotal, 
    SUM(
     CASE 
     WHEN  ORDER_DATE >= CONVERT(DATETIME, '2012-01-01 00:00:00', 102) 
      AND ORDER_DATE <= CONVERT(DATETIME, '2012-07-31 23:59:59', 102)   
     THEN INV_AMOUNT END) AS OrderTotal2 
    ---SUM(PAID_AMT) AS paidTotal2 not needed 
FROM         INVOICES 
WHERE (STATUS = 9) 
GROUP BY CUST_CODE 
+0

'SUM(PAID_AMT)和'SUM(PAID_AMT)AS paidTotal2'是相同的。为什么让他们两次? – Farhan

+0

@MuhammadGhazi你是对的,我刚刚删除它。我只是复制了最初的请求,却没有意识到它们是一样的。 – Taryn

+0

@bluefeet谢谢你是真棒我已经撞了我的头反对键盘几个小时,知道它可能大声笑:) – deccypher

0

究竟是ORDER_DATE的数据类型?为什么不使用CAST你:

cast('2011-01-01 00:00:00' as DATETIME) 

不管怎么说,以此作为你的两个CASE子句:

case 
    when ORDER_DATE between cast('2011-01-01 00:00:00' as datetime) and cast('2011-07-31 23:59:59' as datetime) 
    then... 
end 

对于剩下的,你可以使用bluefeet的查询,因为它已被简化。

0

你不能使用两个列在您的CASE WHEN ... THEN THEN SUM(INV_AMOUNT) AS OrderTotal, SUM(PAID_AMT) AS paidTotal

如果我理解你的问题很好,你需要它分裂INV_AMOUNT成两个值的OrderTotal和OrderTotal2的解决方案。如果你想知道有多少在2011年和2012年separetly是价值,你需要的东西是这样的:AS paidTotal`

SELECT CUST_CODE, 
     SUM(CASE 
      WHEN ORDER_DATE >= CONVERT(DATETIME, '2011-01-01 00:00:00', 102) 
       AND ORDER_DATE <= CONVERT(DATETIME, '2011-07-31 23:59:59', 102) 
      THEN INV_AMOUNT ELSE 0 END) AS OrderTotal, 
      SUM(PAID_AMT) AS paidTotal, 
     SUM(CASE 
      WHEN ORDER_DATE >= CONVERT(DATETIME, '2012-01-01 00:00:00', 102) 
       AND ORDER_DATE <= CONVERT(DATETIME, '2012-07-31 23:59:59', 102) 
      THEN INV_AMOUNT ELSE 0 END) AS OrderTotal2, 
     SUM(PAID_AMT) AS paidTotal2 
    FROM   INVOICES 
    WHERE (STATUS = 9) 
    GROUP BY CUST_CODE