(大众金融)SQL server面试题(2)-游戏打包销售折扣

文章讲述了在面试中遇到的一道关于游戏打包促销的SQL编程题,涉及不同数量游戏的组合及折扣计算,包括找出所有组合方式的数量和价格最贵的打包方案。

今天,面试了一家公司,什么也不说先来三道面试题做做,第二题。

那么,我们就开始做题吧,谁叫我们是打工人呢。

题目是这样的:

销售平台进行游戏打包促销。将任意个游戏打包为一组,根据游戏数量制定折扣。
打包的游戏数量限定2个至4个。当包含2个游戏时折扣为9折,3个时8折,4个时6折。
问1:计算有多少种(个数)不同的打包组合方式。
问2:打包购买游戏时,分别计算出2个打包,3个打包和4个打包时价格最贵的包。要求最终用一个查询得出结果。

GNAMEAMT
A29.33
B19.22
C25.81
D16.79
E20.78
F25.32

---------------------------------------------------------------------------------------------------------------------------------

DROP TABLE IF EXISTS #T_GAME;				
CREATE TABLE #T_GAME (				
  ID INT IDENTITY(1,1),				
  GNAME VARCHAR(50),				
  AMT DECIMAL(10,2),				
  NOTE VARCHAR(255)				
);				
				
INSERT INTO #T_GAME(GNAME, AMT, NOTE) VALUES ('A', 29.33, NULL);				
INSERT INTO #T_GAME(GNAME, AMT, NOTE) VALUES ('B', 19.22, NULL);				
INSERT INTO #T_GAME(GNAME, AMT, NOTE) VALUES ('C', 25.81, NULL);				
INSERT INTO #T_GAME(GNAME, AMT, NOTE) VALUES ('D', 16.79, NULL);				
INSERT INTO #T_GAME(GNAME, AMT, NOTE) VALUES ('E', 20.78, NULL);				
INSERT INTO #T_GAME(GNAME, AMT, NOTE) VALUES ('F', 25.32, NULL);  				
				
				
SELECT T.GROUP_TYPE ,COUNT(1) AS"个数"				
FROM				
(				
SELECT '2' AS GROUP_TYPE, CONCAT(A.GNAME , B.GNAME) AS GNAME_GROUP , A.AMT + B.AMT AS AMT				
FROM #T_GAME A, #T_GAME B				
WHERE A.GNAME < B.GNAME				
UNION				
SELECT '3' AS GROUP_TYPE, CONCAT(A.GNAME, B.GNAME, C.GNAME) AS GNAME_GROUP, A.AMT + B.AMT + C.AMT AS AMT				
FROM #T_GAME A, #T_GAME B, #T_GAME C				
WHERE A.GNAME < B.GNAME				
AND B.GNAME < C.GNAME				
UNION				
SELECT '4' AS GROUP_TYPE, CONCAT(A.GNAME, B.GNAME, C.GNAME, D.GNAME) AS GNAME_GROUP, A.AMT + B.AMT + C.AMT + D.AMT AS AMT				
FROM #T_GAME A, #T_GAME B, #T_GAME C, #T_GAME D				
WHERE A.GNAME < B.GNAME				
AND B.GNAME < C.GNAME				
AND C.GNAME < D.GNAME				
) T				
GROUP BY GROUP_TYPE;				
				
SELECT TOP 1 GROUP_TYPE, GNAME_GROUP, AMT				
FROM				
(				
SELECT '2' AS GROUP_TYPE, CONCAT(A.GNAME , B.GNAME) AS GNAME_GROUP , (A.AMT + B.AMT) * 0.9 AS AMT				
FROM #T_GAME A, #T_GAME B				
WHERE A.GNAME < B.GNAME				
UNION				
SELECT '3' AS GROUP_TYPE, CONCAT(A.GNAME, B.GNAME, C.GNAME) AS GNAME_GROUP, (A.AMT + B.AMT + C.AMT) * 0.8 AS AMT				
FROM #T_GAME A, #T_GAME B, #T_GAME C				
WHERE A.GNAME < B.GNAME				
AND B.GNAME < C.GNAME				
UNION				
SELECT '4' AS GROUP_TYPE, CONCAT(A.GNAME, B.GNAME, C.GNAME, D.GNAME) AS GNAME_GROUP, (A.AMT + B.AMT + C.AMT + D.AMT) * 0.6 AS AMT				
FROM #T_GAME A, #T_GAME B, #T_GAME C, #T_GAME D				
WHERE A.GNAME < B.GNAME				
AND B.GNAME < C.GNAME				
AND C.GNAME < D.GNAME				
) T ORDER BY AMT DESC;				

查询结果如下:

结语:很老的一道面试题目,之前也有人在知乎做过,知乎上提供了第一问的答案,没有第二问的答案,并且是用Oracle格式写的查询SQL,我这里使用SQL server格式重新整理。

仁者见仁智者见智。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值