iT邦幫忙

0

[MYSQL]: 請問以下的報表我如何能夠使用一段SQL查詢出結果?

報表結構 1月份 到課率 統計表

學生名,課堂數,簽到數,到課率

  • 王小明, 10 , 5 , 50%
  • 李大強, 20 , 20 , 100%

表格結構

  • 課堂名, 日期, 學生名, 簽到
  • xxxx , xxxx, 王小明, 1
  • xxxx , xxxx, 王小明, 0
  • xxxx , xxxx, 李大強, 1
  • xxxx , xxxx, 李大強, 0

補充說明:

  1. 以日期為統計區間(忽略課堂名的差異)
  2. 已簽到=1 未簽到(曠課,病假,其他理由) = 0
  3. 每一列單獨計算這一位學生的到課率
  4. Group By 學生名 (學生名只准出現一次)

統計表說明:(歷史統計表)

  1. 課堂數: 這個月這位學生的應該上課的總堂數
  2. 簽到數: 這個月這位學生有簽到的次數
  3. 到課率: 課堂數/簽到數
看更多先前的討論...收起先前的討論...
slime iT邦大師 1 級 ‧ 2019-04-12 10:44:08 檢舉
先講一下您打算怎樣定義 課堂數 簽到數 到課率 ? 公式如何計算? 哪些資料要分組?

比如:
課堂名, 日期, 學生名, 簽到
xxxx , xxxx, 王小明, 1
xxxx , xxxx, 王小明, 0

怎樣換算出:
學生名,課堂數,簽到數,到課率
王小明. 10 . 5 . 50%
SELECT 學生名
,COUNT(課堂名) AS 課堂數
, CASE WHEN 簽到 = 1 THEN COUNT (簽到) END AS 簽到數
, CONVERT(VARCHAR,CONVERT(DECIMAL(5,2),100.0 * 簽到數/COUNT(課堂名))) + '%' AS 到課率
FROM TABLE_NAME
GROUP BY 學生名
順便講一下您打算「誰」「在什麼情形時間點」會輸入那些「簽到=0」的資料?
mrmosstw iT邦新手 5 級 ‧ 2019-04-12 11:00:40 檢舉
不知道補充說明夠不夠詳細 ?
thwu iT邦新手 5 級 ‧ 2019-04-15 09:29:06 檢舉
跟海綿寶寶有一樣的疑問
實務上那些 簽到=0 的資料要弄出來還需要多做事情,一般不會這樣設計。

另外其實 slime 大的問題很關鍵(需求轉邏輯),而且能回答後照理就應該知道怎麼下手了。
或許需要了解一下自己為什麼不會解這個問題,對日後學習才有幫助。
mrmosstw iT邦新手 5 級 ‧ 2019-04-15 10:08:35 檢舉
好的, 謝謝thwu大大的指教, 目前有針對SQL語言開始練習各種題型, 下次提問前會參考其他的邦友怎麼發問的.

2 個回答

2
暐翰
iT邦大師 1 級 ‧ 2019-04-12 11:01:24
最佳解答

Schema (MySQL v5.6)

CREATE TABLE T
	(`課堂名` varchar(6), `日期` varchar(4), `學生名` nvarchar(5), `簽到` int)
;

INSERT INTO T
	(課堂名, 日期, 學生名, `簽到`)
VALUES
	('class1', 'xxxx', N'王小明', 1),
	('class2', 'xxxx', N'王小明', 0),
	('class3', 'xxxx', N'王小明', 0),
	('class3', 'xxxx', N'李大強', 1),
	('class4', 'xxxx', N'王小明', 1),
	('class4', 'xxxx', N'李大強', 1),	
	('class1', 'xxxx', N'李大強', 1),
	('class2', 'xxxx', N'李大強', 1)
;





/*
Result:
學生名,課堂數,簽到數,到課率
李大強. 4 . 4 . 100%
王小明. 4 . 2 . 50%
*/

Query #1

select 學生名,count(distinct `課堂名`) 課堂數,sum(`簽到`) 簽到數
    , Concat(ROUND(sum(`簽到`)*1.0/count(`簽到`)*1.0,2)*100,'%')   到課率
from T
group by 學生名;
學生名 課堂數 簽到數 到課率
李大強 4 4 100.00%
王小明 4 2 50.00%

View on DB Fiddle

看更多先前的回應...收起先前的回應...
暐翰 iT邦大師 1 級 ‧ 2019-04-12 12:20:04 檢舉

我修改MySQL版本 mrmosstw

小魚 iT邦高手 1 級 ‧ 2019-04-12 13:14:12 檢舉

我怎麼覺得這是把自己的作業丟出來給大家做,
我可不是你媽啊...

暐翰 iT邦大師 1 級 ‧ 2019-04-12 13:34:49 檢舉

至少他還有提供原始結構跟期望結果 不用通靈 XD

slime iT邦大師 1 級 ‧ 2019-04-12 15:55:06 檢舉

本來是想引導他把需求逐漸轉成邏輯, 再把邏輯用程式表示, 最後再驗證程式的寫法符合需求.

暐翰 iT邦大師 1 級 ‧ 2019-04-12 16:00:00 檢舉

slime大大有心了...

mrmosstw iT邦新手 5 級 ‧ 2019-04-14 07:17:01 檢舉

感謝大大的指教, 邦友大大們真的很熱心, 非常感謝!

1
純真的人
iT邦高手 1 級 ‧ 2019-04-12 11:08:33

我也練習一下~
這是MSSQL版本XD

declare @tab table(
	課堂名 nvarchar(50)
	, 日期 date
	, 學生名 nvarchar(50)
	, 簽到 int
)
insert into @tab
values('AA','2019/4/1','王小明',1)
,('BB','2019/4/2','王小明',0)
,('AA','2019/4/1','李大強',1)
,('BB','2019/4/2','李大強',1)

select 學生名
,count(0) 課堂數
,sum(簽到) 簽到數
,CONVERT(VARCHAR,CONVERT(DECIMAL(5,2),100.0 * sum(簽到) / count(0))) + '%' AS 到課率
from @tab
group by 學生名

https://ithelp.ithome.com.tw/upload/images/20190412/20061369NuIJvQAgoU.png

mrmosstw iT邦新手 5 級 ‧ 2019-04-15 10:10:06 檢舉

多謝大大的幫助+1

我要發表回答

立即登入回答