sqlserver- select + case……

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_43650411/article/details/102454729
-- 求问题的回答率
-- 回答率 = 回答数/显示数  即ratio = answer/show
USE master
GO

IF EXISTS(SELECT * FROM master.dbo.sysdatabases WHERE name='LeetCode')
	BEGIN
		DROP DATABASE LeetCode
		SELECT 1
	END
GO
CREATE DATABASE LeetCode
GO
USE LeetCode
GO

--IF EXISTS(SELECT * FROM sysobjects WHERE name='survey_log')
IF (OBJECT_ID('survey_log', 'U') IS NOT Null)
	DROP TABLE survey_log
GO
CREATE TABLE survey_log
(
	Id INT IDENTITY
		CONSTRAINT PK_surveyLog PRIMARY KEY,
	uid INT,
	action VARCHAR(20) 
		CONSTRAINT Check_action 
		CHECK(action IN ('show', 'skip', 'answer')),
		--CHECK(action='show' or action='answer' or action='skip'),
	--action VARCHAR(20),
	--CONSTRAINT Check_action CHECK(action in ('show', 'answer', 'skip')),
	question_id INT,
	answer_id INT, 
	q_num INT,
	timestamp INT,
	date DATETIME 
		CONSTRAINT Default_date DEFAULT GETDATE()
)
GO

INSERT INTO survey_log(uid, action, question_id, answer_id, q_num, timestamp)
VALUES
	(5, 'show', 285, null, 1, 123),
	(5, 'answer', 285, 124124, 1, 124),
	(5, 'answer', 369, null, 2, 125),
	(5, 'skip', 369, 1, 2, 126)
GO

SELECT *
FROM survey_log

在这里插入图片描述

-- 回答率 = 回答数/显示数  即ratio = answer/show
-- S1
-- 分别计算回答数 & 显示数
SELECT question_id,
	SUM(CASE
		WHEN action='answer' THEN 1
		ELSE 0
		END) AS num_ans,
	SUM(CASE
		WHEN action='show' THEN 1
		ELSE 0
		END) AS num_show
FROM survey_log
GROUP BY question_id

-- 计算 回答率
SELECT N.question_id,
	N.num_ans/nullif(N.num_show, 0)
FROM
	(
	SELECT question_id,
		SUM(CASE
			WHEN action='answer' THEN 1
			ELSE 0
			END) AS num_ans,
		SUM(CASE
			WHEN action='show' THEN 1
			ELSE 0
			END) AS num_show
	FROM survey_log
	GROUP BY question_id
	) N


SELECT N.question_id
FROM
	(
	SELECT question_id,
		SUM(CASE
			WHEN action='answer' THEN 1
			ELSE 0
			END) AS num_ans,
		SUM(CASE
			WHEN action='show' THEN 1
			ELSE 0
			END) AS num_show
	FROM survey_log
	GROUP BY question_id
	) N
ORDER BY (N.num_ans/nullif(N.num_show, 0)) DESC
OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY 

在这里插入图片描述

-- S2


SELECT question_id
FROM
	(
	SELECT q.question_id,
		ans.cnt_ans,
		s.cnt_show,
		DENSE_RANK() OVER
			(
			ORDER BY 
				CONVERT(decimal(5,2),
				ISNULL(ans.cnt_ans,0)
				/
				--CASE 
					--WHEN s.cnt_show=0 THEN NULL
					--ELSE s.cnt_show
				--END
				-- 等价 NULLIF(s.cnt_show, 0)
				NULLIF(s.cnt_show, 0)
				) DESC
			) AS 'Rank'--'Ratio'
	FROM
		(
		SELECT DISTINCT question_id
		FROM survey_log
		) q
		LEFT JOIN
		(
		SELECT question_id, COUNT(*) AS 'cnt_ans'
		FROM survey_log
		WHERE action='answer'
		GROUP BY question_id
		) ans
		ON q.question_id=ans.question_id
		LEFT JOIN
		(
		-- 2. 显示数 show
		SELECT question_id, COUNT(*) AS 'cnt_show'
		FROM survey_log
		WHERE action IN ('show')
		GROUP BY question_id
		) s
		ON q.question_id=s.question_id
	) R
WHERE R.Rank=1

猜你喜欢

转载自blog.csdn.net/weixin_43650411/article/details/102454729
今日推荐