繁体   English   中英

Oracle SQL查询按条款分组

[英]Oracle Sql query Group by Clause

MY_TABLE =具有2列数字的表,城市。
所需的输出=城市和与城市关联的唯一编号的计数。 西雅图,贝尔维尤(Bellevue)是合并的一部分。 即使有4个与Seattle相关的数字,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

如果有人提供相同的建议,将不胜感激。

你可以做点什么

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语句。

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

请告诉它是否有用

尝试这个:

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) 

可以满足您的要求,但是我怀疑您还有其他一些表,可以在其中定义应该被视为相同的城市,在这种情况下,您需要加入这些表

已经有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

对于没有与任何其他城市相同的数字的每个城市名称,工会的上半部分计算出它具有多少个不同的数字。
下半部分计算出与其他城市共有数字的城市的不同数字计数。 这两个数字总会等于原始表中不同数字的总数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM