2009-10-19 15 views
15

Mam 2 kwerendy w MS SQL, które zwracają liczbę wyników przy użyciu funkcji COUNT.Odejmowanie dwóch kwerend sql

Mogę uruchomić pierwsze zapytanie i uzyskać pierwszy wynik, a następnie uruchomić drugi, aby uzyskać inny wynik, odjąć je i znaleźć wyniki; Jednak czy jest jakiś sposób, aby połączyć wszystkie 3 funkcje i dostać 1 Ogólny wynik

Jak w: Uciekające sql1 SQL2 prowadzonym SQL3 (sql1-SQL2) ....

Próbowałem je xxxx jako funkcja ale bez powodzenia.

+1

Powiedz nam więcej o strukturze tabel i danych, które chcesz uzyskać. Może kwerendy można ponownie napisać, aby wybrać, co chcesz za pomocą tylko jednego pytania. –

Odpowiedz

30

Powinieneś być w stanie wykorzystać podzapytania na to:

SELECT 
    (SELECT COUNT(*) FROM ... WHERE ...) 
    - (SELECT COUNT(*) FROM ... WHERE ...) AS Difference 

Wystarczy go testowane:

Difference 
----------- 
45 

(1 row(s) affected) 
+0

Witam, próbowałem tej metody i daje mi ERROR 1242 (21000) w linii 4: Podzapytanie zwraca więcej niż 1 wiersz. Jakieś sugestie? –

+0

Tak. Upewnij się, że dostajesz tylko jeden wiersz z powrotem, w przeciwnym razie nie możesz go użyć jako skalara. Komunikat o błędzie jest dość jasny w tym względzie. Może powinieneś sprawdzić, jaka jest różnica między twoim problemem a tym podanym w pytaniu. – Joey

+0

Mam do rozwiązania to samo pytanie i to jest moje zapytanie: WYBIERZ (WYBIERZ COUNT (CITY) OD STACJI) - (WYBIERZ COUNT (CITY) OD STACJI GRUPY PRZEZ (CITY)) AS Różnica –

1

Wystarczy utworzyć funkcję inline z logiki zapytań, i zwróci wynik. Przekaż parametry w razie potrzeby.

1
select @result = (select count(0) from table1) - (select count(0) from table2) 
18
SELECT (SELECT COUNT(*) FROM t1) - (SELECT COUNT(*) FROM t2) 
+1

DZIĘKI to rozwiązuje:) ... najprostsza rzecz ... ahhh czasami – andreas

+1

Dzięki! To było takie proste, ale w całej sieci ludzie sugerują, by robić ekstrawaganckie logiki SQL, aby uzyskać to, gdy wystarczy zwykły minus. – Siddhartha

1
SELECT 
    t1.HowManyInTable1 
    ,t2.HowManyInTable2 
    ,t1.HowManyInTable1 = t2.HowManyInTable2 Table1_minus_Table2 
from (select count(*) HowManyInTable1 from Table1) t1 
    cross join (select count(*) HowManyInTable2 from Table2) t2 
1

Wiem, że to stary post, ale tutaj jest inne rozwiązanie, które najlepiej pasują do moich potrzeb (testowane na Firebird)

SELECT c1-c2 from (select count(*) c1 from t1), (SELECT COUNT(*) c2 from t2); 
0

((SELECT SUBSTRING_INDEX (SUBSTRING_INDEX (m, '/', 2), '/', - 1) FROM ms WHERE ms.id = t.m_id) - (SELECT COUNT (id) Z T AS tr WHERE tr.m_id = t.m_id) ) AS pozostało