Resultate zweier Query zusammenführen

TheShihan

Mitglied
Hallo,

DB-System: MSSQL2k

Ich habe folgende zwei Queries:
SQL:
SELECT     STATE,COUNT(STATE) AS STATE_COUNT_ALL
FROM         admin.TI$INV
GROUP BY STATE
ORDER BY STATE

SQL:
SELECT     STATE, COUNT(STATE) AS STATE_COUNT_OWN
FROM         admin.TI$INV
WHERE BUSDIV IN (0020, 0022, 0024, 0040, 0090)
GROUP BY STATE
ORDER BY STATE

Ich würde draus gerne ein einziges machen, dass mir folgende Spalten zurückgibt:
| STATE | STATE_COUNT_ALL | STATE_COUNT_OWN |

quasi der Status, dann die gesammt Anzahl (Rechnungen) pro Status und in der letzen Spalte nur die Rechnungs-Anzahl welche in einem bestimmten BUKRS sind.

Ich habe schon mit diversen JOINS rumgeübt oder mit UNION, doch es kam nie so raus wie ich wollte. Irgendwie denke ich, dass kann ja nicht so schwer sein (habe eigentlich schon einige Jahre SQL Erfahrung),.. aber vermutlich ist es noch zu früh am Morgen :-)

Evtl. hat einer von euch ne Idee oder kann mich auf die richtige Spur bringen?

Danke und Gruss, Shi
 
Hallo,

Du kannst es mit einem UNION machen.

Code:
SELECT     STATE,COUNT(STATE) AS STATE_COUNT_ALL,0 STATE_COUNT_OWN
FROM         admin.TI$INV
GROUP BY STATE
UNION
SELECT     STATE, 0,COUNT(STATE) AS STATE_COUNT_OWN
FROM         admin.TI$INV
WHERE BUSDIV IN (0020, 0022, 0024, 0040, 0090)
GROUP BY STATE

Musst mal schauen ob Du die "Lücken" mit 0 füllen willst.

Gruß
 
ah cool danke, das funktioniert wunderbar.

hatte selbst eine ähnliche Lösung, allerdings habe ich beim ersten SELECT den letzten Teil nicht gehabt ",0 STATE_COUNT_OWN" wusste nicht dass man das so machen müsste.

Und das mit den "0" brauche ich schon so. Was ich noch nicht schnalle ist, wie ich dass nun wieder pro Status Gruppieren, Summieren kann.

Da ich folgendes Resultat bräuchte:
STATE | ALL | OWN
611 | 5 | 3

und nicht noch aufgesplittet wie im Moment:
STATE | ALL | OWN
611 | 5 | 0
611 | 0 | 3

Wie macht man sowas bei diesem UNION-"Konstrukt"?

und danke nochmals!

Gruss, Shi
 
also ein bisschen weiter bin ich wahrscheinlich gekommen, habe in einer anderen Frage in nem anderem Forum was gefunden (WITH) dass hier nützen soll.

Das Query sieht nun wie folgt aus:
SQL:
WITH Summary(STATE, STATE_COUNT_ALL, STATE_COUNT_OWN) AS 
(
	SELECT     STATE, COUNT(STATE) AS STATE_COUNT_ALL, 0 STATE_COUNT_OWN
	FROM         admin.TI$INV
	GROUP BY STATE
	UNION
	SELECT     STATE, 0,COUNT(STATE) AS STATE_COUNT_OWN
	FROM         admin.TI$INV
	WHERE BUSDIV IN (4100)
	GROUP BY STATE
)
SELECT STATE, STATE_COUNT_ALL, STATE_COUNT_OWN FROM Summary
GROUP BY STATE

Aber irgendwie läuft das Query nicht. Obwohl es genau gleich aufgebaut ist wie im anderen Post oder wie in der SQL-Hilfe selbst. Folgende Fehlermeldung kommt (die mir wie üblich gar nichts nützt, da es den Fehler zu wenig genau angibt):
Code:
Meldung 156, Ebene 15, Status 1, Zeile 1
Incorrect syntax near the keyword 'WITH'.

Sieht jemand von euch den Fehler? Ich weiss nicht, was ich noch ändern soll :-(
 
Hallo,

versuch mal das
Code:
SELECT STATE, SUM(STATE_COUNT_ALL) STATE_COUNT_ALL, SUM(STATE_COUNT_OWN) STATE_COUNT_OWN
FROM (
SELECT     STATE,COUNT(STATE) AS STATE_COUNT_ALL,0 STATE_COUNT_OWN
FROM         admin.TI$INV
GROUP BY STATE
UNION
SELECT     STATE, 0,COUNT(STATE) AS STATE_COUNT_OWN
FROM         admin.TI$INV
WHERE BUSDIV IN (0020, 0022, 0024, 0040, 0090)
GROUP BY STATE) t
GROUP BY STATE
 
oh da haben wir uns wohl gerade beim posten gekreuzt :-)

Dein Query liefert mir ein Ergebniss, allerdings sind alle STATE_COUNT_OWN Werte "0"... ich denke mit meinem WITH-Query (das ja ziemlich ähnlich ist), geht es evtl. in die "richtigere" Richtung ;-).. nur müsste es dazu noch funktionieren.. :-\
 
ok, habe das Qry nun mit fremder Hilfe hinbekommen, für diejenigen die es interessiert es sieht nun so aus:

SQL:
SELECT
	invstates.STATE_ID AS STATE
	,ISNULL(t1.COUNTALL, 0) AS COUNT_ALL
	,ISNULL(t2.COUNTSUB, 0) AS COUNT_SUB
FROM
	(SELECT 
		STATE
		,COUNT(*) AS COUNTALL
	FROM
		admin.TI$INV
	GROUP BY STATE) AS t1 INNER JOIN
	(SELECT
		STATE
		,COUNT(*) AS COUNTSUB
	FROM
		admin.TI$INV
	WHERE 
		(BUSDIV IN (1000, 1001, 1003, 3400, 4000, 4400, 4401, 4402, 4500, 5101, 5200))
	GROUP BY STATE) AS t2 ON t1.STATE = t2.STATE
RIGHT OUTER JOIN
	admin.TIC$INVSTATE AS invstates ON t1.STATE = invstates.STATE_ID
ORDER BY invstates.STATE_ID
 
Zurück