SQL verbindet 2 Abfragen, die eine Spalte gemeinsam nutzen
-
13-12-2019 - |
Frage
Ich habe 2 SQL-Abfragen, die sich eine Spalte mit dem Namen teilen catalogid
Abfrage # 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
Abfrage # 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
Wie würden Sie diese 2 zu einer Abfrage machen oder ihnen beitreten?
Hinweis: Ich führe diese 2 als aus SqlCommand
von vb.net
Eine Sache zu bemerken ist, dass ich die gleichen Bedingungen für beide Abfragen habe, was ich versucht habe, ist das Hinzufügen der zweiten Abfrageteile zu dem ausgewählten Fall, der nicht geklappt hat
Hier sind die beteiligten Tabellen
oitems-Tabelle
+---------+-----------+----------+
| orderid | catalogid | numitems |
+---------+-----------+----------+
| o737 | 353 | 1 |
| o738 | 364 | 4 |
| o739 | 353 | 3 |
| o740 | 364 | 6 |
| o741 | 882 | 2 |
| o742 | 224 | 5 |
| o743 | 224 | 2 |
+---------+-----------+----------+
bestellungstabelle
+-----------------+------------+------------+
| 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
+-----------------+------------+------------+
ergebnis von Abfrage # 1:
+-----------+----------+--------------+
| catalogid | numitems | ignoreditems |
+-----------+----------+--------------+
| 353 | 4 | 0 |
| 364 | 10 | 0 |
| 882 | 2 | 0 |
| 224 | 0 | 7 |
+-----------+----------+--------------+
ergebnis von Abfrage # 2:
+-----------+------------------------+--------------+
| catalogid | ProcessedSucssessfully | NotProcessed |
+-----------+------------------------+--------------+
| 353 |o737,o739 | |
| 364 |o738,o740 | |
| 882 |o741 | |
| 224 | |o742,o743 |
+-----------+------------------------+--------------+
das gewünschte Ergebnis:
+-----------+-----------+--------------+-------------------------+---------------+
| catalogid | numitems | ignoreditems | ProcessedSucssessfully | NotProcessed |
+-----------+-----------+--------------+-------------------------+---------------+
| 353 | 4 | 0 | o737,o739 | |
| 364 | 10 | 0 | o738,o740 | |
| 882 | 2 | 0 | o741 | |
| 224 | 0 | 7 | | o742,o743 |
+-----------+-----------+--------------+-------------------------+---------------+
Die Bedingungen für die Abfrage1:
wenn
ocardtype
leer ist, dann ignoriere dienumitems
und betrachte es als0
in der Summe und Summe die ignorierten Elemente zumignoreditems
Spaltewenn ocardtype für eine Bestellung MasterCard oder Visa ist und das Datum leer ist, ignorieren Sie die numitems und betrachten Sie es als 0 und summieren Sie die ignorierten Elemente zum
ignoreditems
Spaltewenn
ocardtype
ist Paypal oder Sofort, dann mach einfach dasnumitems
summe ohne Überprüfung des Datums, da für diese Typen keine erforderlich sindodate
Die Bedingungen für Abfrage2, die mit Abfrage1 identisch sind, aber unterschiedliche Dinge zu tun haben:
wenn
ocardtype
ist leer, dann fügen Sie hinzuorderid
zuNotProcessed
wenn
ocardtype
für einige Bestellungen ist MasterCard oder Visa und dieodate
ist leer, dann fügen Sie hinzuorderid
zuNotProcessed
wenn
ocardtype
ist Paypal oder Sofort, dann schau nicht nachodate
und fügen Sie dieorderid
zuProcessedSucssessfully
Die obigen Dinge werden in 2 separaten Abfragen ausgeführt, aber ich versuche, es in einer Abfrage zu machen, da sie die gleichen Bedingungen haben
Lösung
Ok, los geht's, ich habe die Tabellenstruktur aufgebaut, um die SQL zu validieren.Ich habe keine Daten geladen, aber es wird ausgeführt.
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
Andere Tipps
Sie könnten eine Ansicht in der SQL-Box erstellen und dann einfach auf diese Ansicht zugreifen
select * from table_a inner join table_b on table_a.field_a = table_b.field_b
BEARBEITEN:
oder
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
Die SQL Server-Ansicht würde ungefähr so aussehen
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