という列を共有する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つを1つのクエリにする、または結合するにはどうすればよいですか?
これら2つをSqlCommand
vb.netから実行していることに注意してください
注意すべき点の1つは、両方のクエリで同じ条件を使用していることです。私が試したのは、2番目のクエリ部分を選択したケースに追加してもうまくいかなかったことです。
関連するテーブルは次のとおりです
oitemsテーブル
+---------+-----------+----------+
| 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
PaypalまたはSofortの場合は、をチェックして追加し
ocardtype
ないでください。odate
orderid
ProcessedSucssessfully
上記は2つの別々のクエリで実行されますが、条件が同じであるため、1つのクエリにまとめようとしています。