SQL объединяет 2 запроса, которые разделяют столбец
У меня есть 2 запроса SQL, которые разделяют столбец с именем catalogid
Запрос № 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) then numitems
else 0 end) numitems,
sum(numitems) allitems
from orders o"
join oitems i on i.orderid=o.orderid"
join products T1 on T1.catalogid = i.catalogid"
group by i.catalogid) X
Запрос № 2:
SELECT catalogId, ProcessedSucssessfully =
STUFF((SELECT ', ' + CAST( b.orderid as varchar(10))
FROM oitems b JOIN orders o ON b.orderid = o.orderid
WHERE b.catalogId = a.catalogId
AND (o.ocardtype in ('PayPal','Sofort') OR o.ocardtype in ('mastercard','visa') and o.odate is not null)
FOR XML PATH('')), 1, 2, ''),
NotProcessed =
STUFF((SELECT ', ' + CAST( c.orderid as varchar(10))
FROM oitems c JOIN orders o ON c.orderId = o.orderid
WHERE c.catalogid = a.catalogid
AND (o.ocardtype in ('mastercard') OR o.ocardtype is null) and o.odate is null
FOR XML PATH('')), 1, 2, '')
FROM oitems a
GROUP BY a.CatalogId
Как бы вы сделали эти 2 в один запрос или присоединиться к ним?
Обратите внимание, я запускаю эти 2 как SqlCommand
с vb.net
Стоит заметить, что у меня одинаковые условия для обоих запросов, и я попытался добавить вторые части запроса в случай выбора, который не сработал.
Вот соответствующие таблицы
таблица с данными
+---------+-----------+----------+
| orderid | catalogid | numitems |
+---------+-----------+----------+
| o737 | 353 | 1 |
| o738 | 364 | 4 |
| o739 | 353 | 3 |
| o740 | 364 | 6 |
| o741 | 882 | 2 |
| o742 | 224 | 5 |
| o743 | 224 | 2 |
+---------+-----------+----------+
стол заказов
+-----------------+------------+------------+
| 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
+-----------------+------------+------------+
результат из запроса № 1:
+-----------+----------+--------------+
| catalogid | numitems | ignoreditems |
+-----------+----------+--------------+
| 353 | 4 | 0 |
| 364 | 10 | 0 |
| 882 | 2 | 0 |
| 224 | 0 | 7 |
+-----------+----------+--------------+
результат из запроса № 2:
+-----------+------------------------+--------------+
| catalogid | ProcessedSucssessfully | NotProcessed |
+-----------+------------------------+--------------+
| 353 |o737,o739 | |
| 364 |o738,o740 | |
| 882 |o741 | |
| 224 | |o742,o743 |
+-----------+------------------------+--------------+
желаемый результат:
+-----------+-----------+--------------+-------------------------+---------------+
| catalogid | numitems | ignoreditems | ProcessedSucssessfully | NotProcessed |
+-----------+-----------+--------------+-------------------------+---------------+
| 353 | 4 | 0 | o737,o739 | |
| 364 | 10 | 0 | o738,o740 | |
| 882 | 2 | 0 | o741 | |
| 224 | 0 | 7 | | o742,o743 |
+-----------+-----------+--------------+-------------------------+---------------+
Условия для Query1:
если
ocardtype
пусто, тогда игнорируйтеnumitems
и считают это0
в сумме и суммировать игнорируемые пункты вignoreditems
колонкаесли ocardtype для какого-либо заказа - MasterCard или Visa, а значение odate пустое, тогда игнорируйте numitems и считайте его равным 0 и суммируйте игнорируемые элементы в
ignoreditems
колонкаесли
ocardtype
такое Paypal или Sofort, тогда просто сделайтеnumitems
сумма без проверки даты, потому что эти типы не требуютodate
Условия для Query2, которые такие же, как Query1, но разные вещи:
если
ocardtype
пусто тогда добавьorderid
вNotProcessed
если
ocardtype
для некоторого заказа MasterCard или Visa иodate
пусто тогда добавьorderid
вNotProcessed
если
ocardtype
такое Paypal или Sofort, тогда не проверяйтеodate
и добавитьorderid
вProcessedSucssessfully
Вышеуказанные действия выполняются в 2 отдельных запроса, но я пытаюсь сделать это в один запрос, поскольку они имеют одинаковые условия
3 ответа
Хорошо, мы пошли, я построил структуру таблицы для проверки SQL. Я не загружал никаких данных, но он выполняется.
SELECT * FROM
(
Select
catalogid, numitems, allitems - numitems ignoreditems
from
(
select
i.catalogid,
case
when ocardtype in ('PayPal','Sofort') then sum(i.numitems)
when ocardtype in ('mastercard','visa') and odate is not null then sum(i.numitems)
else 0 end numitems,
sum(numitems) allitems
from
orders o
inner join
oitems i
on
i.orderid=o.orderid
inner join
products T1
on
T1.catalogid = i.catalogid
group by
i.catalogid, ocardtype, odate
) A
) B
INNER JOIN
(
SELECT
catalogId,
ProcessedSucssessfully =
STUFF((SELECT ', ' + CAST( b.orderid as varchar(10))
FROM oitems b JOIN orders o ON b.orderid = o.orderid
WHERE b.catalogId = a.catalogId
AND (o.ocardtype in ('PayPal','Sofort') OR o.ocardtype in ('mastercard','visa') and o.odate is not null)
FOR XML PATH('')), 1, 2, ''),
NotProcessed =
STUFF((SELECT ', ' + CAST( c.orderid as varchar(10))
FROM oitems c JOIN orders o ON c.orderId = o.orderid
WHERE c.catalogid = a.catalogid
AND (o.ocardtype in ('mastercard') OR o.ocardtype is null) and o.odate is null
FOR XML PATH('')), 1, 2, '')
FROM
oitems a
GROUP BY
a.CatalogId
)C
ON
B.CatalogId = C.CatalogId
Вы можете создать представление на поле SQL, а затем просто Linq для этого представления
select * from table_a inner join table_b on table_a.field_a = table_b.field_b
РЕДАКТИРОВАТЬ:
или же
Select * from (select * from table_a inner join table_b on table_a.field_a = table_b.field_b) AB
inner join
select * from (select * from table_c inner join table_d on table_c.field_c = table_d.field_d) CD
ON
AB.id_column = CD.id_column
SQL-сервер будет выглядеть примерно так
SELECT * FROM
(
Select
catalogid, numitems, allitems - numitems ignoreditems
from
(
select * from
(
select
i.catalogid,
sum(case when (ocardtype in ('PayPal','Sofort')
OR
ocardtype in ('mastercard','visa') and odate is not null) then numitems
else 0 end) numitems,
sum(numitems) allitems
from
orders
) o
inner join
items i
on
i.orderid=o.orderid
inner join
products T1
on
T1.catalogid = i.catalogid
group by
i.catalogid
) A
) X
) B
INNER JOIN
SELECT * FROM
(
SELECT
catalogId,
ProcessedSucssessfully =
STUFF((SELECT ', ' + CAST( b.orderid as varchar(10))
FROM oitems b JOIN orders o ON b.orderid = o.orderid
WHERE b.catalogId = a.catalogId
AND (o.ocardtype in ('PayPal','Sofort') OR o.ocardtype in ('mastercard','visa') and o.odate is not null)
FOR XML PATH('')), 1, 2, ''),
NotProcessed =
STUFF((SELECT ', ' + CAST( c.orderid as varchar(10))
FROM oitems c JOIN orders o ON c.orderId = o.orderid
WHERE c.catalogid = a.catalogid
AND (o.ocardtype in ('mastercard') OR o.ocardtype is null) and o.odate is null
FOR XML PATH('')), 1, 2, '')
FROM
oitems a
GROUP BY
a.CatalogId
) B
ON A.CatalogId = B.CatalogId