iT邦幫忙

0

次數統計ORACLE SQL

  • 分享至 

  • twitterImage

請問各位大大 Table 結構如下
學生 去過的地方
小明 巴黎
小明 巴黎
小明 美國
小王 日本
小美 巴黎
小美 日本
小王 中國
小美 巴黎
小美 日本
小明 巴黎
小王 中國
小美 美國

要Show出如下結果,SQL如何下?
學生 去過的地方 次數排名 次數
小明 巴黎 1 2
小明 美國 2 1
小王 中國 1 2
小王 日本 2 1
小美 巴黎 1 2
小美 日本 1 2
小美 美國 2 1

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

3
暐翰
iT邦大師 1 級 ‧ 2019-08-29 14:56:57
最佳解答

邏輯 :

  • 使用Group by 學生,地方得出次數
  • 使用rank windows function以學生為組,按照次數倒序得出你要的結果

線上測試連結 SQL Fiddle

Oracle 11g R2 Schema Setup:

CREATE TABLE T
	(StudentName nvarchar2(50), Country nvarchar2(50))
;

INSERT ALL 
	INTO T (StudentName, Country)
		 VALUES (N'小明', N'巴黎')
	INTO T (StudentName, Country)
		 VALUES (N'小明', N'巴黎')
	INTO T (StudentName, Country)
		 VALUES (N'小明', N'美國')
	INTO T (StudentName, Country)
		 VALUES (N'小王', N'日本')
	INTO T (StudentName, Country)
		 VALUES (N'小美', N'巴黎')
	INTO T (StudentName, Country)
		 VALUES (N'小美', N'日本')
	INTO T (StudentName, Country)
		 VALUES (N'小王', N'中國')
	INTO T (StudentName, Country)
		 VALUES (N'小美', N'巴黎')
	INTO T (StudentName, Country)
		 VALUES (N'小美', N'日本')
	INTO T (StudentName, Country)
		 VALUES (N'小明', N'巴黎')
	INTO T (StudentName, Country)
		 VALUES (N'小王', N'中國')
	INTO T (StudentName, Country)
		 VALUES (N'小美', N'美國')
SELECT * FROM dual
;

Query 1:

select rank() over (partition by StudentName order by count(1) desc) 次數排名 
  ,StudentName as 學生
  ,Country as 去過的地方
  ,count(1) as 次數 from T
group by StudentName,Country

Results:

| 次數排名 | 學生 | 去過的地方 | 次數 |
|------|----|-------|----|
|    1 | 小明 |    巴黎 |  3 |
|    2 | 小明 |    美國 |  1 |
|    1 | 小王 |    中國 |  2 |
|    2 | 小王 |    日本 |  1 |
|    1 | 小美 |    日本 |  2 |
|    1 | 小美 |    巴黎 |  2 |
|    3 | 小美 |    美國 |  1 |

我要發表回答

立即登入回答