2011-09-02 23 views
5

Bu üç farklı veritabanı sunucusunda herhangi bir değişiklik yapmadan MySQL, MSSQL, PostgreSQL gibi bir Sorguya ihtiyacım var.Birkaç alanın DISTINCT sayımı sadece MySQL'de çalışır mı?

field_char = character 
field_int = integer 
field_date = datetime 

ifadesi içinde olan: farklı tipte ayrıdır

COUNT(DISTINCT field_char,field_int,field_date) AS costumernum 

alanları Bu sorgu i MySQL düzgün çalışması, aşağıdaki ifade ile bir sütun hesaplamak gerekir üst sorgusu seçmek, bu yüzden bir alt sorgu yaklaşımla sonucu elde etmek çalışırsanız, ben bu durumda takılmaları: Bu quer ile bir hata alıyorum

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 

y, ana sorgunun değerini nasıl alabilirim?

İfade, MySQL üzerinde düzgün çalışıyor ancak Sql Server veya PostgreSQL üzerinde çalıştırmayı denediğimde bir hata alıyorum (sorun, sayı işlevinin MSSQL/PostgreSQL'de farklı türden 3 bağımsız değişken kabul etmemesidir), Bu veritabanı sunucusunun (SQL Server, MySQL, PostgreSQL) her birinde çalışan bir ifadeyle aynı sonucu elde etmenin bir yolu var mı?

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

yeni bilgi için Düzen:

Ne (borç dahil) ayrı listeye katılmadan çalışırsanız ve aşağıdaki gibi

cevap

7

herhangi bir platformda Bunu yapmanın genel bir yoldur sonra sayımı yapıyor? Bazı test verileri oluşturdum ve bu işe yarıyor gibi görünüyor. COUNT'un t1 sütunlarından birinde olduğundan emin olun - aksi halde t1'de karşılık gelen girişler olmadığında yanlışlıkla 0 yerine 1 döndürür.

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

Bu yaklaşımla daha önce denedim, tek sorun, alt sorguyu ana sorgudan almam gereken bir değerle filtrelemem gerektiğidir, bu iletiye bakın: http://stackoverflow.com/questions/ 7088107/nasıl yapılır-iç içe-alt sorgulama-tanıma-üst-sorgulama-sütun – aleroot

+0

Görüyorum, ek gereksinimleri gidermek için yayınladı. –

+0

Çalıştığını görünce, ama MySQL üzerinde son derece yavaş, neden bilmiyorum, diğer veritabanı sunucusunda oldukça hızlı çalışıyor ... Bir çözüm biliyor musunuz? – aleroot

0

Birleştirme hakkında ne düşünüyorsunuz?

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

Uyarı: birleştirme operatörü RDBMS lezzet ile değişebilir.

Güncelleme

Görünüşe göre, birleştirme operatörü taşınabilirliği kendisi tarafından soru:

Ben distinct konuda size yardım etmeye çalıştı.

+0

Neden sadece concat kullanıyorsunuz?Matematik operatörü – ajreal

+0

Cast işini doğru bir şekilde kullanmıyorum, ancak her bir veritabanı için aynı sorguyu kullanamıyorum: Mysql, PostgreSQL, MSSQL, çünkü string birleştirme için sözdizimi bu veritabanı sunucusu arasında farklı ... – aleroot

İlgili konular