我有一張表,其中包含分佈在五個不同列上的名稱列表。我試圖獲得6個最常見的不同名稱。每個名稱只會出現在每個記錄中一次。五列是name_1,name_2 ... name_5。爲了名字,請將表格稱爲「mytable」。選擇可能出現在多列中的結果的頻率(SQL)
任何幫助將不勝感激。
我有一張表,其中包含分佈在五個不同列上的名稱列表。我試圖獲得6個最常見的不同名稱。每個名稱只會出現在每個記錄中一次。五列是name_1,name_2 ... name_5。爲了名字,請將表格稱爲「mytable」。選擇可能出現在多列中的結果的頻率(SQL)
任何幫助將不勝感激。
這裏有一個辦法:
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
;
在表中有多少行呢?
完美工作。謝謝:) – 2012-01-29 03:03:33
@AndrewFewkes:不客氣! – ruakh 2012-01-29 03:03:49
試試這個:
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
您應該能夠從每個表中選擇所有名稱並將結果合併在一起。然後你可以計算每個名字出現的次數。
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
缺少聯合表的名稱。 – 2012-01-29 02:52:01
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;
你應該真的重新考慮你的設計。 – 2012-01-29 05:51:23