2016-03-29 3 views
3

Ich versuche, den Zählwert 0 zu erhalten, wenn keine Zeilen vorhanden sind, die der Bedingung entsprechen.So erhalten Sie count (*) Wert 0 in wählen aus wo Gruppe von

Ich habe einen großen Tisch. Aber ich poste eine abgeschnittene Tabelle, da sie erklärt, was ich will.

Beispiel

Tabelle 1:

**name year title** 
name1 2008 title1 
name2 2009 title2 
name3 2010 title1 
name1 2008 title2 
name4 2009 title1 
name2 2008 title2 

Ich möchte für jeden Namen die Anzahl der Zeilen zeigen, wo Jahr = 2008. Also, wenn es keine Zeile mit dem Jahr 2008 gibt. Ein Name und seine Anzahl 0 sollte angezeigt werden.

Ausgang sollte sein:

**name count** 
    name1 2 
    name2 1 
    name3 0 
    name4 0 

Umgehung:

select p.name,(select count(*) 
       from table1 b 
       where b.name=p.name) as count 
from table1 p 
where p.year=2008; 

versucht, einige mehr. Aber keiner von ihnen hat funktioniert.

Antwort

7

Try this:

select p.name, 
     count(case when p.year=2008 then 1 end) as count 
from table1 p 
group by p.name 

Die Abfrage verwendet bedingte Aggregation um bedingt year=2008 Vorkommen von p.name Werte zählen zu.

+0

Dank. :) Du hast meinen halben Tag gerettet! Habe meinen ersten halben Tag damit verbracht. Allerdings gelernt, einige andere neue Dinge in SQL. – sailesh

1

Sie könnten es auch mit DECODE tun. Natürlich ist CASE ziemlich klar und ausführlich.

SELECT NAME, 
     COUNT(DECODE(YEAR, 2008, 1)) COUNT 
FROM your_table 
GROUP BY NAME 
ORDER BY COUNT DESC; 

Zum Beispiel

SQL> WITH sample_data AS(
    2 SELECT 'name1' NAME, 2008 YEAR FROM dual UNION ALL 
    3 SELECT 'name2' NAME, 2009 YEAR FROM dual UNION ALL 
    4 SELECT 'name3' NAME, 2010 YEAR FROM dual UNION ALL 
    5 SELECT 'name1' NAME, 2008 YEAR FROM dual UNION ALL 
    6 SELECT 'name4' NAME, 2009 YEAR FROM dual UNION ALL 
    7 SELECT 'name2' NAME, 2008 YEAR FROM dual 
    8 ) 
    9 --end of sample_Data mimicking real table 
10 SELECT NAME, 
11   COUNT(DECODE(YEAR, 2008, 1)) COUNT 
12 FROM sample_data 
13 GROUP BY NAME 
14 ORDER BY COUNT DESC; 

NAME  COUNT 
----- ---------- 
name1   2 
name2   1 
name4   0 
name3   0 

SQL> 
+0

@sailesh Also? Sind Sie mit den sample_data in der WITH-Klausel verwechselt, die zum Erstellen eines funktionierenden Testfalls verwendet wurde? –

+0

Hoppla. Ich bin neu in diesem Bereich. Es tut uns leid! – sailesh

+0

@sailesh Kein Problem. Wir verwenden die WITH-Klausel, um einen Beispiel-Testfall genau wie eine statische Tabelle zu erstellen, was sample_data nachahmt. –

1

Für den Datensatz gegeben, gibt @GiorgosBetsos eine gute Antwort.

Eine andere, allgemeinere Antwort verwendet zwei Tabellen. Eines mit den Daten (eine Faktentabelle) und eins mit der Namensliste (eine Dimensionstabelle). Das ergibt folgendes Konstrukt ...

SELECT 
    person_dimension.name, 
    COUNT(fact_table.title) 
FROM 
    person_dimension 
LEFT JOIN 
    fact_table 
     ON fact_table.person_id = person_dimension.id 
     AND fact_table.year = 2008 
GROUP BY 
    person_dimension.name 

Auf diese Weise erzwingen Sie sich auch, Ihre Datenstruktur zu normalisieren. Obwohl es verlockend sein könnte, alle Ihre Daten in so wenigen Tabellen wie möglich zu speichern (möglicherweise nur ein Ereignis), führt dieser Weg zu vielen Problemen in relationalen Datenbanken. Es ist viel mehr Standard, Fakten und Dimensionen zu trennen.

Ein zusätzlicher Vorteil hier ist, dass Sie dann auf eine Untergruppe von Namen sehr leicht filtern können. Zum Beispiel ....

SELECT 
    person_dimension.name, 
    COUNT(fact_table.title) 
FROM 
    person_dimension 
LEFT JOIN 
    fact_table 
     ON fact_table.person_id = person_dimension.id 
     AND fact_table.year = 2008 
WHERE 
    person_dimension.country = 'Unknown' 
GROUP BY 
    person_dimension.name 
-1
select p.name, 
    count(*) over(partition by name) as cnt 
    from table1 p where year=2008 
    order by cnt; 
+0

zählen (p.year)? Das OP wollte ROWs für das Jahr = 2008 zählen. – mathguy

+0

noch etwas @mathguy –

+0

Dies wird nicht die "Namen", die keine Zeile mit Jahr = 2008 in der Tabelle, wie das OP angefordert. Testen Sie Ihre Lösungen vor dem Posten? Es ist eine gute Übung. Prost! – mathguy