2012-01-29 19 views
3

我有一張表,其中包含分佈在五個不同列上的名稱列表。我試圖獲得6個最常見的不同名稱。每個名稱只會出現在每個記錄中一次。五列是name_1,name_2 ... name_5。爲了名字,請將表格稱爲「mytable」。選擇可能出現在多列中的結果的頻率(SQL)

任何幫助將不勝感激。

+1

你應該真的重新考慮你的設計。 – 2012-01-29 05:51:23

回答

3

這裏有一個辦法:

SELECT name, COUNT(1) 
    FROM (   SELECT name_1 AS name FROM mytable 
     UNION ALL SELECT name_2 AS name FROM mytable 
     UNION ALL SELECT name_3 AS name FROM mytable 
     UNION ALL SELECT name_4 AS name FROM mytable 
     UNION ALL SELECT name_5 AS name FROM mytable 
     ) AS myunion 
GROUP BY name 
ORDER BY COUNT(1) DESC LIMIT 6 
; 

在表中有多少行呢?

+0

完美工作。謝謝:) – 2012-01-29 03:03:33

+0

@AndrewFewkes:不客氣! – ruakh 2012-01-29 03:03:49

1

試試這個:

SELECT iTable.iName, Count(iTable.iName) as TotalCount 
FROM 
(
    SELECT DISTINCT name_1 as iName FROM myTable 
     UNION 
    SELECT DISTINCT name_2 as iName FROM myTable 
     UNION 
    SELECT DISTINCT name_3 as iName FROM myTable 
     UNION 
    SELECT DISTINCT name_4 as iName FROM myTable 
     UNION 
    SELECT DISTINCT name_5 as iName FROM myTable 
) as iTable 
GROUP BY iTable.iName 
ORDER BY TotalCount DESC 
LIMIT 6 
0

您應該能夠從每個表中選擇所有名稱並將結果合併在一起。然後你可以計算每個名字出現的次數。

select * 
from 
(
    select name, count(*) 
    from (
    select name from table1 
    union all 
    select name from table2 
    union all 
    select name from table3 
    union all 
    select name from table4 
    union all 
    select name from table5 
) 
    group by name 
    order by count(*) desc 
) 
where rownum <= 6 
+0

缺少聯合表的名稱。 – 2012-01-29 02:52:01

0

UNION + subselect在這種情況下應該爲你工作。

SELECT name_1, COUNT(*) FROM (
    SELECT name_1 FROM mytable 
    UNION ALL SELECT name_2 FROM mytable 
    UNION ALL SELECT name_3 FROM mytable 
    UNION ALL SELECT name_4 FROM mytable 
    UNION ALL SELECT name_5 FROM mytable 
) AS names GROUP BY name_1 ORDER BY 2 DESC LIMIT 6;