2016-03-30 22 views
0

Oracle SQL komut dosyasında sorun yaşıyorum. Çoğu yayını olan tüm yazarları (oturum açma) seçmem gerekiyor. Aynı sayıda yayına sahip daha fazla giriş varsa, hepsini seçmem gerekiyor.SQL ORACLE - Çoğu yayını (çoğu satırı) kullanarak yazarın seçilmesi MAX()

SELECT P.LOGIN, COUNT(*) 
FROM PISE P 
GROUP BY P.LOGIN, HAVING COUNT(*) >= MAX(PUBLICATIONS) 
(
SELECT COUNT(*) AS PUBLICATIONS 
FROM PISE P 
GROUP BY P.LOGIN 
); 

ORA-00933 sonuçlanan: SQL komutu düzgün

sona eren değil list of publications looks like this:

ben .. şu ana kadar böyle bir şey yapıyor denedim MAX() işlevini kullanmak ihtiyaç

veya

SELECT P.LOGIN, COUNT(*) as PUBLICATIONS 
FROM PISE P 
GROUP BY P.LOGIN HAVING PUBLICATIONS >= MAX(PUBLICATIONS); 

res "YAYIN": ORA-00904 içinde ulting geçersiz tanımlayıcı

veya

SELECT P.LOGIN, COUNT(*) 
    FROM PISE P 
    WHERE COUNT(*) IN (
    SELECT MAX(COUNT(*)) 
    FROM PISE 
    ); 

ORA-00934 sonuçlanan: grup buradaki görevi izin verilmez.

This is the result I am looking for

(Jmeno ve Prijmeni sütunu olmadan). (Sürümleri 11 ve üzeri mevcuttur) "hükmündeki ile"

+1

Neden YAYINLAR> = MAX (YAYINLAR) değil = (eşittir)? Diğer denemede neden COUNT (*) IN (SELECT MAX ...) ve "IN" yerine = (eşit)? Her iki durumda da = en mantıklıdır. AYRICA: Yazarların adı ve soyadı orijinal tabloda yer almıyor, çıktıda nasıl görünmelerini istersiniz? Muhtemelen bir katılmaya ihtiyacınız olacaktır (eğer ilk ve son isimler olması gerektiği gibi başka bir tabloda ise), ancak bunun hakkında hiçbir bilgi vermediniz. – mathguy

+0

Evet, değiştirmek> = hiç farketmez. Orada olduğum şeyin başlangıcında, ama bir şekilde onu çözmeye çalışırken, aklıma gelen her şeyi denedim. changin IN to = aynı sonuçla bitiyor. DÜZENLEME: ad ve soyadı farklı tabloda yer alır, daha sonra ekleyeceğim, ama çözülmem gereken şeyi değil, bu yüzden ihmal ettim. Başka bir deyişle, problemimi sorunun köküne basitleştirmeye çalıştım. – sKyTzi

+0

Doğru - Sorguları düzeltebileceğini önermiyordum (her şeyden önce, hem> = hem de "IN" mükemmel bir şekilde meşrudur - sadece verimsiz). Sorgunuz başarısız çünkü ilk sorgudan sonra hemen bir alt sorguyu başlatıyorsunuz. Muhtemelen bir WHERE maddesinin olması gerekiyordu, ancak WHERE kelimesi mevcut değil. İkinci sorgu başarısız çünkü diğer ad (örneğin SELECT yan tümce) eklenir (SELECT yan tümce) yalnızca GROUP BY yan tümce, böylece GROUP BY düzeyinde hiçbir tanımlayıcı "PUBLICATIONS" (henüz) yoktur. – mathguy

cevap

0

kullanma:

with a as (select login, count(*) as cnt from p group by login), 
    b as (select max(cnt) as max_cnt from a) 
select a.login, a.cnt from a, b where a.cnt = b.max_cnt 
/
+0

ORA-04044: yordam, işlev, paket ya da türü buraya izin verilmiyor 04044. 00000 - "yordam, işlev, paket ya da tür burada izin verilmiyor" * Neden: Bir yordam, işlev ya da paket belirtildi. Bir ifade içinde bir uygun yer. * Eylem: İsmin doğru olduğundan emin olun veya kaldırın. Benim sürümümün daha eski olduğunu tahmin ediyorum :) – sKyTzi

+0

??Sağladığım bir SQL deyimidir, bir yordam veya işleve sarmayı denediniz mi? Muhtemelen sürümle ilgisi yoktur - kesinlikle bu hata mesajıyla değil. Sorguyu Oracle sürümümde test ettim ve iyi çalışıyor. Versiyonun nedir Lütfen aşağıdaki SQL deyimini çalıştırın (herhangi bir işlevde veya yordamda WRAPPED DEĞİLDİR) ve size ne anlattığını görün: select * from v $ sürüm – mathguy

+0

Bu arada, orijinal tablonuzun adı olarak "p" harfim var (kodun ilk satırı); lütfen bunu gerçek tablo adınıza değiştirin. – mathguy

İlgili konular