Случай SQL Select
У меня есть следующие таблицы sql
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
+-----------------+------------+------------+
reusltant datatable называется result
+-----------+----------+--------------+
| catalogid | numitems | ignoreditems |
+-----------+----------+--------------+
| 353 | 4 | 0 |
| 364 | 10 | 0 |
| 882 | 2 | 0 |
| 224 | 0 | 7 |
+-----------+----------+--------------+
идея состоит в том, чтобы суммировать столбец numitems для продуктов, которые имеют тот же самый catalogid
, отображающий данные в таблице oitems
со следующими условиями
- Если
ocardtype
пуст, то игнорируйте numitems
и считайте его как 0
в сумме и сумме игнорируемых элементов на ignoreditems
Столбец
- если
ocardtype
для некоторого порядка MasterCard
или Visa
и odate
пуст, тогда игнорируйте numitems
и рассмотрите его как 0
и суммировать игнорируемые элементы в столбце ignoreditems
- если
ocardtype
есть Paypal
или Sofort
, просто выполните numitems
сумма не проверяя дату, потому что для этих типов не требуется odate
В основном я хочу сохранить результат, относящийся к временному datatable, и загрузить его в vb.net datatable
Мне сложно определить, как это сделать в SQL-запросе! Мне нужно это как команда sql для vb.net, смог сделать это программно, используя datatables vb.net, используя циклы и много проверок
использование linq - это опция, но мне просто нужно получить это с сервера
Ответы
Ответ 1
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
Ответ 2
Что-то вроде:
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
(Предполагая, что везде, где вы использовали слово "пусто" в своем повествовании, вы имеете в виду столбец NULL
)
Ответ 3
Вот версия вашего исходного запроса Linq-to-sql (как запрос LINQpad):
Dim odateRequired = {"MasterCard", "Visa"}
Dim odateNotRequired = {"Paypal", "Sofort"}
Dim result = From o In Orders Join i In Oitems On o.orderid Equals i.orderid _
Let check = o.ocardtype IsNot Nothing _
AndAlso ((odateRequired.Contains(o.ocardtype) _
AndAlso o.odate IsNot Nothing) _
OrElse odateNotRequired.Contains(o.ocardtype)) _
Group By i.catalogid Into _
numitem = Sum(If(check, i.numitems, 0)), _
ignored = Sum(If(check, 0, i.numitems))
result.Dump
Ваш дополнительный запрос в комментариях к RichardTheKiwi отвечает (он просто включает Not (From b In Bookeds Where b.ignoredoid=i.orderid).Any AndAlso
в начале check
):
Dim odateRequired = {"MasterCard", "Visa"}
Dim odateNotRequired = {"Paypal", "Sofort"}
Dim result = From o In Orders Join i In Oitems On o.orderid Equals i.orderid _
Let check = Not (From b In Bookeds Where b.ignoredoid = i.orderid).Any _
AndAlso o.ocardtype IsNot Nothing _
AndAlso ((odateRequired.Contains(o.ocardtype) _
AndAlso o.odate IsNot Nothing) _
OrElse odateNotRequired.Contains(o.ocardtype)) _
Group By i.catalogid Into _
numitem = Sum(If(check, i.numitems, 0)), _
ignored = Sum(If(check, 0, i.numitems))
result.Dump