I have the following sql tables
oitems table
+---------+-----------+----------+
| orderid | catalogid | numitems |
+---------+-----------+----------+
| O737 | 353 | 1 |
| O738 | 364 | 4 |
| O739 | 353 | 3 |
| O740 | 364 | 6 |
| O741 | 882 | 2 |
| O742 | 224 | 5 |
| O743 | 224 | 2 |
+---------+-----------+----------+
Orders table
+-----------------+------------+------------+
| orderid | ocardtype | odate |
+-----------------+------------+------------+
| O737 | Paypal | | 'OK
| O738 | MasterCard | 01.02.2012 | 'OK
| O739 | MasterCard | 02.02.2012 | 'OK
| O740 | Visa | 03.02.2012 | 'OK
| O741 | Sofort | | 'OK
| O742 | | | 'ignore because ocardtype is empty
| O743 | MasterCard | | 'ignore because Mastercard no odate
+-----------------+------------+------------+
the reusltant datatable called result
+-----------+----------+--------------+
| catalogid | numitems | ignoreditems |
+-----------+----------+--------------+
| 353 | 4 | 0 |
| 364 | 10 | 0 |
| 882 | 2 | 0 |
| 224 | 0 | 7 |
+-----------+----------+--------------+
idea is to sum the numitems column for products that have the same catalogid
depinding on the data in the oitems
table with the following conditions
ocardtype
is empty then ignore the numitems
and consider it
as 0
in the sum and sum the ignored items to the ignoreditems
columnocardtype
for some order is MasterCard
or Visa
and
the odate
is empty then ignore the numitems
and consider it as
0
and sum the ignored items to the ignoreditems
columnocardtype
is Paypal
or Sofort
, then just do the numitems
sum
without checking the date because those types require no odate
basicly i want to save the result datatable to a temporary datatable and load it to a vb.net datatable
i am having a hard time figuring out how to do this in an sql query! i need this as sql command for vb.net , was able to do it programmatically using vb.net datatables using loops and alot of checking using linq is an option, but i just need to get this from the server
select catalogid, numitems, allitems - numitems ignoreditems
from (
select i.catalogid,
sum(case when (ocardtype in ('PayPal','Sofort') OR
ocardtype in ('mastercard','visa') and
odate is not null) AND NOT EXISTS (
select * from booked b
where b.ignoredoid = o.orderid
) then numitems
else 0 end) numitems,
sum(numitems) allitems
from orders o
join oitems i on i.orderid=o.orderid
group by i.catalogid
) X
Something like:
SELECT
oi.catalog_id,
SUM(CASE
WHEN ocardtype in ('Paypal','Sofort') THEN numitems
WHEN ocardtype in ('Mastercard','Visa') and odate is not null THEN numitems
ELSE 0 END) as numitems,
SUM(CASE
WHEN ocardtype is null then numitems
WHEN ocardtype in ('Mastercard','Visa') and odate is null THEN numitems
ELSE 0 END) as ignoreditems
FROM
oitems oi
inner join
Orders o
on
oi.orderid = o.orderid
GROUP BY
oi.catalog_id
(Assuming that wherever you've used the word "empty" in your narrative, you mean the column is NULL
)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With