2016-06-06 18 views
5

Desidero restituire il conteggio più elevato di parole chiave che appartengono a categorie, sottocategorie e tipi specifici.Ottieni il conteggio più alto per righe specifiche

dobbiamo usare WHERE SubKat_ID IS NOT NULL and only WHERE Type = A

Quindi qualcosa di simile:

SELEZIONA 'ottenere più alto numero di parole chiave' dalla tabella WHERE Kat_ID = x E Type = 'A' e SubKat IS NOT NULL

dati Esempio:

ID Keyword_ID Kat_ID SubKat_ID Type 
29 1   247  NULL  A 
30 2   247  NULL  A 
31 3   247  NULL  A 
32 3   247  96   A 
33 4   247  96   A 
34 2   247  96   A 
35 3   247  95   A 
37 4   33  NULL  B 
40 6   33  44   A 
41 3   33  44   A 
42 4   33  66   A 
43 11   33  66   A 
44 7   33  66   A 
45 2   33  66   A 
46 8   55  NULL  A 

esempi delle coppie in base ai dati in fondo del mio post:

1 ° prova:

WHERE Kat_ID = 247 And Type = 'A' 

dovrebbe dice: 3 perché abbiamo: le righe 3x per 96 e 1x95

2 ° prova:

WHERE Kat_ID = 33 And Type = 'A' 

dovrebbe dice: 4 perché abbiamo: righe 2x per 44 e 4x66

3 ° prova:

WHERE Kat_ID = 55 And Type = 'A' 

dovrebbe dice: 0

risposta

2

Questo dovrebbe trattare con il vostro caso limite troppo:

select coalesce(max(t.cnt), 0) as max_cnt 
    from (select count(*) as cnt 
      from tbl 
     where kat_id = x 
      and type = 'A' 
      and SubKat_ID is not null 
     group by SubKat_ID) t 
+0

grazie che quello che stavo cercando - dal modo in cui perché hai usato coalesce che cosa è quello per? –

+2

Per il tuo ultimo caso, poiché non ci sono righe che soddisfano la tua condizione, la chiamata alla funzione 'max()' restituisce 'null'. La chiamata a 'coalizione' sta dicendo che se' max (t.cnt) 'è nullo, sostituirlo con' 0'. – sstan

+0

Solo per aggiungere un post eccellente a @sstan. 'COALESCE' viene utilizzato come equivalente a' ISNULL' in quanto sopra. Ma a volte ci possono essere differenze di comportamento, quindi vale la pena controllare [MSDN] (https://msdn.microsoft.com/en-gb/library/ms190349 (v = sql.105) .aspx). Vale anche la pena sottolineare che 'ISNULL' non è ANSI Standard mentre' COALESCE' è. Ecco un buon collegamento a un comportamento più approfondito e alle differenze di rendimento [MSSQLtips - Coalesce v IsNull] (https://www.mssqltips.com/sqlservertip/2689/deciding-between-coalesce-and-isnull-in-sql-server/) – BeaglesEnd

1

E 'questo quello che vuoi?

SELECT TOP 1 COUNT(*) 
FROM T 
WHERE Kat_ID = 247 And Type = 'A' 
GROUP BY SubKat_ID 
ORDER BY COUNT(*) DESC; 
+0

ho aggiunto alla tua richiesta DOVE SubKat IS NOT NULL, ma io non sto ottenendo 0 per esempio per la mia terza prova. –

0
SELECT count(1) as [Count], Kat_ID, SubKat_ID, [Type] 

from table 

WHERE Kat_ID = x And Type = 'A' And SubKat IS NOT NULL 

group by Kat_ID, SubKat_ID, [Type] 

si desidera utilizzare la clausola GROUP BY per dire al motore di gruppo valori uguali a questi colonna insieme.

+0

mi sta restituendo righe anziché il numero –

+0

Le istruzioni Select restituiscono righe. A volte una riga con una colonna, ma è sempre righe. –

+0

thx, ma secondo la mia domanda ho bisogno di restituire il numero –

0

Prova questa:

SELECT TOP 1 CASE WHEN RecType = 'NULL' THEN 0 ELSE cnt END AS RecordCount FROM--TOP 1 FROM 
(
    SELECT COUNT(*) as cnt, 'NOT NULL' as RecType 
    FROM #tmp 
    WHERE Kat_ID = 33 AND Type = 'A' 
     AND SubKat_ID is not null 
    GROUP BY SubKat_ID 
UNION 
    SELECT COUNT(*) AS cnt, 'NULL' AS RecType 
    FROM #tmp WHERE Kat_ID = 33 AND Type = 'A' 
     AND SubKat_ID IS NULL 
) AS T1 
ORDER BY cnt desc 

ma sento che mi manca un modo più semplice.

+0

ok ma come nel mio terzo esempio in cui kat 55 dovrei ottenere 0 ma vedo che non c'è niente come cambiarlo per ottenere 0 invece? –

+1

Quindi vuoi ancora ottenere un conteggio nel caso in cui gli unici record esistenti abbiano NULL per SubKat_ID? – RDJ

+0

esattamente questo è vero –

0
select max(count(1)) from stck 
WHERE Kat_ID = 247 And Type = 'A' and SubKat_ID is not null 
group by SubKat_ID 

select max(count(1)) from stck 
WHERE Kat_ID = 33 And Type = 'A' and SubKat_ID is not null 
group by SubKat_ID 

select nvl(max(count(1)),0) from stck 
WHERE Kat_ID = 55 And Type = 'A' and SubKat_ID is not null 
group by SubKat_ID 

Have written above queries on top oracle db 
+0

Queste query non sono valide, anche in Oracle. Non è possibile avere una doppia funzione di chiamata aggregata in questo modo: 'max (count (1))'. – sstan

+1

Ho appena eseguito e visto i risultati, verificato e quindi pubblicato :) – MNC

+0

Bello, non sapevo che Oracle lo permettesse con clausole 'group by'. Peccato che la domanda sia per SQL Server, che non supporta questo :( – sstan