SQL الانضمام إلى 2 الاستفسارات التي تشترك في العمود
-
13-12-2019 - |
سؤال
لدي 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
شيء واحد أن نلاحظ هو عندي نفس شروط لكل الاستفسارات ما حاولت القيام به هو إضافة الثانية الاستعلام أجزاء حدد الحالة التي لم تنجح
هنا هي المشاركة الجداول
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 لبعض أمر ماستركارد أو فيزا و أوداته فارغة ثم تجاهل numitems ويعتبر 0 وخلاصة القول تجاهل البنود
ignoreditems
العمودإذا
ocardtype
باي بال أو Sofort ، ثم مجرد القيامnumitems
المبلغ دون التحقق من التاريخ لأن تلك الأنواع لا تحتاج إلىodate
شروط Query2 التي هي نفس Query1 ولكن أشياء مختلفة ينبغي القيام به:
إذا
ocardtype
فارغة ثم إضافةorderid
إلىNotProcessed
إذا
ocardtype
عن بعض أمر ماستركارد أو فيزا ،odate
فارغة ثم إضافةorderid
إلىNotProcessed
إذا
ocardtype
باي بال أو Sofort, ثم لا تحققodate
وإضافةorderid
إلىProcessedSucssessfully
الأشياء المذكورة أعلاه تتم في 2 منفصلة الاستعلامات, ولكن أنا أحاول أن تجعل من الدخول إلى استعلام واحد منذ لديهم نفس الظروف
المحلول
حسنا هنا نذهب, أنا بنيت بنية الجدول التحقق 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 server عرض ننظر بشيء من هذا القبيل
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