2 Stimmen

Oracle Sql-Abfrage Group by-Klausel

MY_TABLE = Tabelle mit 2 Spalten Nummer, Stadt.
Gewünschte Ausgabe = Stadt und Anzahl der eindeutigen Nummern, die mit der Stadt verbunden sind. Seattle, Bellevue ist Teil von Combined. Obwohl 4 Nummern mit Seattle, Bellevue verbunden sind, ist die Ausgabe 3, da es nur 3 verschiedene Nummern gibt - 123, 456, 786.

  MY_TABLE
Nummer   Stadt
123  Seattle
456  Bellevue
789  LosAngeles
780  LosAngeles
123  Bellevue
786  Bellevue

Gewünschte Ausgabe:

Combined 3
LosAngeles 2

Bisherige Abfrage:

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

Ich würde es sehr schätzen, wenn jemand Empfehlungen dazu geben könnte.

3voto

Justin Cave Punkte 220606

Sie könnten so etwas machen

SELECT (case when city IN ('Seattle', 'Bellevue') 
             then 'Kombiniert'
             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 'Kombiniert'
                else city
           end) 

Natürlich vermute ich, dass Sie eine andere Tabelle haben, die Ihnen sagt, welche CITY-Werte kombiniert werden müssen, anstatt einen fest codierten CASE-Anweisung zu haben.

2voto

golgofa Punkte 103
mit t als (
SELECT (
        case when city IN ('Seattle', 'Bellevue') 
        then 'Kombiniert'
        else city
        end
    ) city, number from my_table
)
select city, count(distinct number) from t
group by city

Sagen Sie bitte, ob es nützlich war

1voto

MiMo Punkte 11593

Versuchen Sie das:

SELECT 
  (CASE CITY
  WHEN 'Seattle' THEN ‘Kombiniert’ 
  WHEN 'Bellevue' THEN ‘Kombiniert’ 
  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 ‘Kombiniert’ 
    WHEN 'Bellevue' THEN ‘Kombiniert’ 
    ELSE CITY 
    END) 

dies sollte das tun, was Sie gefragt haben, aber ich vermute, dass Sie einige andere Tabellen haben, in denen definiert ist, welche Städte als gleich betrachtet werden sollen, in einem solchen Fall müssen Sie mit diesen Tabellen verknüpfen

1voto

Morbo Punkte 521

Es gibt bereits 3 Antworten und keine davon sind generisch für weitere Städte. Versuche dies:

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 'Kombiniert', 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 ermittelt für jeden Städtenamen, der keine Zahlen mit einer anderen Stadt gemeinsam hat, wie viele verschiedene Zahlen es gibt.
Die untere Hälfte ermittelt die Anzahl verschiedener Zahlen für Städte, die Zahlen mit anderen Städten gemeinsam haben. Diese beiden Zahlen ergeben immer die Anzahl der verschiedenen Zahlen in der Originaltabelle.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X