2011-09-02 13 views
5

Ho bisogno di una query che senza modifiche funzioni su questi tre diversi server di database: MySQL, MSSQL, PostgreSQL. In questa query devo calcolare una colonna con la seguente espressione che funziona correttamente su MySQL:Conta su DISTINCT di diversi campi che funzionano solo su MySQL?

COUNT(DISTINCT field_char,field_int,field_date) AS costumernum 

I campi nella distinti di diverso tipo:

field_char = character 
field_int = integer 
field_date = datetime 

L'espressione è all'interno di un query padre selezionare, quindi se provo ad ottenere il risultato con un approccio sub interrogazione, inciampo in questa situazione:

SELECT t0.description,t0.depnum 
(select count(*) from (
    select distinct f1, f2, f3 from salestable t1 
    where t1.depnum = t0.depnum 
) a) AS numitems 
FROM salestable t0 

ottengo un errore con questo quer y, come posso ottenere il valore della query genitore?

L'espressione funziona correttamente su MySQL ma ottengo un errore quando provo ad eseguirlo su Sql Server o PostgreSQL (il problema è che la funzione count non accetta 3 argomenti di tipo diverso su MSSQL/PostgreSQL), è esiste un modo per ottenere lo stesso risultato con un'espressione che funziona in ciascuno di questi server di database (SQL Server, MySQL, PostgreSQL)?

risposta

7

Un modo generale di fare questo su qualsiasi piattaforma è la seguente:

select count(*) from (
    select distinct f1, f2, f3 from table 
) a 

Modifica per nuove informazioni:

Che cosa succede se si tenta di entrare alla lista distinta (compreso il reparto) e quindi facendo il conteggio? Ho creato alcuni dati di test e questo sembra funzionare. Assicurati che COUNT si trovi su una delle colonne t1, altrimenti restituirà erroneamente 1 anziché 0 quando non ci sono voci corrispondenti in t1.

SELECT t0.description, t0.depnum, count(t1.depnum) as 'numitems' 
FROM salestable t0 
LEFT JOIN (select distinct f1,f2,f3,depnum from salestable) t1 
    ON t0.depnum = t1.depnum 
GROUP BY 
    t0.description, t0.depnum 
+0

Ho già provato con questo approccio, l'unico problema è che devo filtrare la sottoquery con un valore che devo ottenere dalla query padre, vedere questo post: http://stackoverflow.com/questions/ 7088107/how-to-get-a-nested-sub-query-to-riconoscere-parent-query-column – aleroot

+0

Vedo, post modificato per soddisfare ulteriori requisiti. –

+0

Sembra che funzioni, ma su MySQL è estremamente lento, non so perché, nell'altro server di database funziona abbastanza velocemente ... Conosci una soluzione? – aleroot

0

Come concatenarsi?

COUNT(DISTINCT field_char || '.' || 
       cast(field_int as varchar) || '.' || 
       cast(field_date as varchar)) AS costumernum 

Attenzione: il vostro operatore di concatenazione può variare di sapore RDBMS.

Aggiornamento

A quanto pare, la portabilità operatore di concatenazione è questione di per sé:

ho cercato di aiutarvi con il problema distinct.

+0

Perché non usare solo concat?Non mi sento sicuro dell'uso dell'operatore di matematica – ajreal

+0

Cast funziona correttamente ma non riesco a utilizzare la stessa query per ogni database: Mysql, PostgreSQL, MSSQL, perché la sintassi per la concatenazione di stringhe è diversa tra questi server di database ... – aleroot

Problemi correlati