2016-06-23 4 views
1

Ich habe mehrere Abfragen, die nur eine Anzahl (nur eine Zelle) in einer Spalte produziert. Ich muss diese Spalten kombinieren.Kombinieren Sie die Ergebnisse mehrerer SQL-Abfragen in mehreren Spalten ganz allein

Angenommen, die Abfragen sind:

select count (*) from address where city = NULL as citycount; 
select count (*) from address where countrycode = 4 as countrycount; 
select count (*) from address; 

Über Abfragen werden die Ergebnisse zurück:

citycount 

40 

countrycount 

50 

count(*) 

400045 

ich über Abfragen in einer solchen Weise kombinieren wollen, so dass Ergebnis sein wird:

citycount countrycount count(*) 

    40  50   400045 

Dies bedeutet, dass die Spalten kombiniert werden. Ich habe mehr als 30 Abfragen. Vielen Dank im Voraus

+1

hilft frage ich mich, wie 'Stadt = null' bekommt ein Ergebnis. –

+0

Arbeiten Sie an Oracle (das PL/SQL unterstützt) oder Informix (das PL/SQL von Oracle nicht unterstützt)? Die Schreibweise "= NULL" wird von Informix (oder Standard-SQL, AFAIK) nicht akzeptiert, daher sollten Sie die Frage wahrscheinlich mit Oracle markieren (wie in der PL/SQL-Tagbeschreibung angegeben) und wahrscheinlich nicht mit Informix, es sei denn, Sie erklären dies brauche eine zweisprachige Lösung (in diesem Fall wird nicht '= NULL' verwendet). –

+0

Der Ausdruck 'COUNT (*) - COUNT (Stadt)' sollte Ihnen die Anzahl der Nullstädte geben ('COUNT (column_name)' zählt die Anzahl der Nicht-Null-Werte). –

Antwort

2

Verwendung SUM mit CASE-Ausdruck:

select 
    sum(case when city = NULL then 1 else 0 end) as citycount, 
    sum(case when countrycode=4 then 1 else 0 end) as countrycount, 
    count(*) as countt 
    from address 
+2

'Stadt ist NULL'? – jarlh

+0

Dies basiert auf Benutzerabfrage, er könnte ansi NULL gesetzt haben :) – TheGameiswar

+0

Ist das Oracle/plsql oder Informix Verhalten? – jarlh

1
select 
(select count (*) from address where city IS NULL) as citycount, 
(select count (*) from address where countrycode = 4) as countrycount, 
count(*) 
from address 
+0

Danke Vlad, ich habe das selbe auch versucht es funktioniert gut für 2-3 Abfragen. Aber nicht für 20-30 Abfragen. Können wir den optimierten Weg haben – app

+0

@app: Das ist mehr oder weniger, was notwendig sein wird. Wenn Ihre Aggregate unterschiedliche Filterbedingungen haben, benötigen Sie unterschiedliche Ausdrücke entlang der Linien, um sie zu berechnen. Oder Sie können die CASE-Formulierung in einer anderen Antwort verwenden. Das Überprüfen der Abfragepläne würde Ihnen sagen, welche die leistungsstärkste Variante ist - sie hängt vom Optimierer ab (und stellt sicher, dass Sie über geeignete Indizes verfügen usw.). –

0

versuchen, etwas so ... hoffe, es

CREATE TABLE #TEST 
(
ID INT IDENTITY(1,1) NOT NULL, 
Cnt INT NOT NULL, 
DescTableName VARCHAR(100) NULL 
) 

INSERT INTO #TEST (Cnt, DescTableName) 
SELECT COUNT(*) AS Cnt, 'citycount' AS DescTableName FROM dbo.[Subscriptions] 

INSERT INTO #TEST (Cnt, DescTableName) 
SELECT COUNT(*) AS Cnt, 'countrycount' AS DescTableName FROM dbo.ReportSchedule 

INSERT INTO #TEST (Cnt, DescTableName) 
SELECT COUNT(*) AS Cnt, 'address' AS DescTableName FROM msdb.dbo.sysjobs 

SELECT * FROM #TEST 

DROP TABLE #TEST 
+0

Das wird drei Reihen in der '# TEST' Tabelle geben, nicht wahr? Keine Zeile mit drei Werten. Ihre zweite und dritte Operation sollten UPDATE-Operationen sein, nicht INSERT-Operationen. –

Verwandte Themen