Reputation: 15
HI I`m probably over complicating my code so looking for a better method.
i have an invoice table and I'm comparing 2 date ranges I'm looking for a simple sql statement that will look at the date is in range 1 add to ordertotal1 else if in date range 2 add to ordertotal2
this is my attempt
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
of course this is really wrong and throws up a lot of errors, i think I'm doomed to running several queries in my php to achieve it, but I`m sure I remember doing something like the above in the past.
FYI: running php 5 Mssql 2000 (not by choice) on apache 2.2 for windows.
Thanks for any help offered
Upvotes: 1
Views: 433
Reputation: 247840
It appears that your CASE
statement are missing the 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
Or better yet:
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
Upvotes: 1
Reputation: 7695
You cant use two column in your CASE WHEN ... THEN THEN SUM(INV_AMOUNT) AS OrderTotal, SUM(PAID_AMT) AS paidTotal
IF I understand your question well, you need a solution which is splitting the INV_AMOUNT into two value OrderTotal and OrderTotal2. If you want to know how much was the value in 2011 and in 2012 separetly, you need something like this:
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
Upvotes: 0
Reputation: 2575
What exactly is the datatype of ORDER_DATE? Why aren't you using CAST:
cast('2011-01-01 00:00:00' as DATETIME)
Anyways, use this as your two CASE clauses:
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
For the rest, you can use bluefeet's query, as it has been simplified.
Upvotes: 0