2012-03-31 15 views
2

MY_TABLE = Tabelle mit 2 Spalten Anzahl, Stadt.
Gewünschte Ausgabe = Stadt und Anzahl der eindeutigen Nummer, die der Stadt zugeordnet ist. Seattle, Bellevue ist Teil von Combined. Obwohl gibt es 4 Nummern zugeordnet Seattle, Bellevue ist der Ausgang 3, da es nur 3 verschiedene Zahlen - 123, 456, 786.Oracle Sql Abfrage Gruppe nach Klausel

MY_TABLE 
Number City 
123 Seattle 
456 Bellevue 
789 LosAngeles 
780 LosAngeles 
123 Bellevue 
786 Bellevue 

gewünschte Ausgabe:

Combined 3 
LosAngeles 2 

Abfrage so weit:

SELECT NUMBER, CITY FROM MY_TABLE WHERE LOOKUP_ID=100 AND CITY IN 
('Seattle', 'Bellevue', 'LosAngeles') 
GROUP BY NUMBER, CITY 

Würde sehr zu schätzen wissen, wenn jemand eine Empfehlungen rund um die gleiche bietet.

Antwort

3

Sie könnten etwas tun, wie

SELECT (case when city IN ('Seattle', 'Bellevue') 
      then 'Combined' 
      else city 
      end) city, 
     count(distinct number) 
    FROM my_table 
WHERE lookup_id = 100 
    AND city IN ('Seattle', 'Bellevue', 'LosAngeles') 
GROUP BY (case when city IN ('Seattle', 'Bellevue') 
       then 'Combined' 
       else city 
      end) 

natürlich meine Vermutung ist, dass Sie eine andere Tabelle, die Sie dieerzählt-Werte müssen kombiniert werden, anstatt eine hartcodierte CASE-Anweisung zu haben.

1

Try this:

SELECT 
    (CASE CITY 
    WHEN 'Seattle' THEN ‘Combined’ 
    WHEN 'Bellevue' THEN ‘Combined’ 
    ELSE CITY 
    END), COUNT(*) 
FROM 
    MY_TABLE 
WHERE 
    LOOKUP_ID=100 AND CITY IN ('Seattle', 'Bellevue', 'LosAngeles') 
GROUP BY 
    NUMBER, 
    (CASE CITY 
    WHEN 'Seattle' THEN ‘Combined’ 
    WHEN 'Bellevue' THEN ‘Combined’ 
    ELSE CITY 
    END) 

das tun sollten, was Sie gefragt, aber ich vermute, dass Sie einige andere Tabellen, wo Sie definieren, welche Städte sollten die gleichen in Betracht gezogen werden, in einem solchen Fall die Sie benötigen, beitreten auf diesen Tabellen

2
with t as (
SELECT (
     case when city IN ('Seattle', 'Bellevue') 
     then 'Combined' 
     else city 
     end 
    ) city, number from my_table 
) 
select city, count(distinct number) from t 
group by city 

Bitte informieren Sie, wenn es nützlich war

+0

Es war, Danke! –

1

Es gibt 3 Antworten bereits und keiner von ihnen sind für weitere Städte generisch. Try this:

SELECT City, COUNT(Number) AS ExclusiveNumbers 
FROM (SELECT q2.City, q2.CityNumCount, b.Number 
     FROM MY_Table b INNER JOIN 
      (SELECT c.City, MAX(NumOccurs) AS CityNumCount 
      FROM My_Table c INNER JOIN 
          (SELECT Number, COUNT(City) AS NumOccurs 
           FROM My_Table 
           GROUP BY Number) q1 ON c.Number = q1.Number 
      GROUP BY c.City) q2 ON b.City = q2.City) q3 
WHERE CityNumCount = 1 
GROUP BY City 
UNION 
SELECT 'Combined', COUNT(DISTINCT Number) 
FROM (SELECT q2.City, q2.CityNumCount, b.Number 
     FROM MY_Table b INNER JOIN 
      (SELECT c.City, MAX(NumOccurs) AS CityNumCount 
      FROM My_Table c INNER JOIN 
          (SELECT Number, COUNT(City) AS NumOccurs 
           FROM My_Table 
           GROUP BY Number) q1 ON c.Number = q1.Number 
      GROUP BY c.City) q2 ON b.City = q2.City) q3 
WHERE CityNumCount > 1 

Die obere Hälfte der Union für jeden Stadtnamen ausarbeitet, die keine Zahlen gemeinsam mit jeder anderen Stadt hat, wie viele verschiedene Zahlen hat.
Die untere Hälfte berechnet die Anzahl der verschiedenen Zahlen für Städte, die Zahlen mit anderen Städten gemeinsam haben. Diese 2 Zahlen addieren sich immer zur Anzahl der eindeutigen Zahlen in der Originaltabelle.