Oracle Sql запрос Группировать по пунктам - PullRequest
2 голосов
/ 01 апреля 2012

MY_TABLE = Таблица с 2 столбцами Номер, Город.
Желаемый результат = Город и количество уникальных номеров, связанных с городом. Сиэтл, Bellevue является частью Combined. Несмотря на то, что с Сиэтлом связано 4 числа, на выходе Bellevue - 3, поскольку есть только 3 разных числа - 123, 456, 786.

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

Желаемый вывод:

Combined 3
LosAngeles 2

Запрос до сих пор:

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

Буду очень признателен, если кто-нибудь даст рекомендации примерно того же.

Ответы [ 4 ]

3 голосов
/ 01 апреля 2012

Вы могли бы сделать что-то вроде

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) 

Конечно, я предполагаю, что у вас есть другая таблица, которая сообщает вам, какие CITY значения должны быть объединены, вместо того, чтобы иметь жестко запрограммированный оператор CASE.

2 голосов
/ 01 апреля 2012
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

Скажите пожалуйста, было ли это полезно

1 голос
/ 01 апреля 2012

Уже есть 3 ответа, и ни один из них не является общим для большего количества городов.Попробуйте это:

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

Верхняя половина объединения работает, для каждого названия города, которое не имеет общих номеров с любым другим городом, сколько у него различных чисел.
Нижняя половина работаетВычислите количество различных чисел для городов, которые имеют общие номера с другими городами.Эти 2 цифры всегда будут складываться из числа различных чисел в исходной таблице.

1 голос
/ 01 апреля 2012

Попробуйте:

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) 

, который должен делать то, что вы просили, но я подозреваю, что у вас есть другие таблицы, в которых вы определяете, какие города следует считать одинаковыми, в таком случаенужно присоединиться к этим таблицам

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...