2012-03-31 109 views
2

MY_TABLE =带2列的表格数字,城市。
所需输出=城市和与城市相关的唯一编号的数量。西雅图,贝尔维尤是Combined的一部分。即使有4个关联到西雅图号码,贝尔维尤的输出为3,因为只有3个不同的号码 - 123,456,786Oracle Sql查询按分组划分

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 

如果有人提供相同的建议,我将非常感激。

回答

3

你可以做类似

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声明。

1

试试这个:

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) 

应该做你问什么,但我怀疑你有你定义一些其他表哪些城市应被视为是相同的,在这种情况下,你需要加入这些表

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 

泰尔请,如果它是有用的

+0

这是,谢谢! – 2012-04-01 01:03:09

1

有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 

工会的上半部分的作品出来,对于没有共同的数字与其他任何城市,有多少不同的号码都有每个城市的名字。
下半部分计算出与其他城市有共同数字的城市的不同数量。这两个数字将始终合计为原始表格中不同数字的计数。