SQL练习题合集

声明:本文来自公众号练习题笔记整理,仅供学习交流,如有侵权,请联系博主删除,谢谢


Date:2021/7/29
Difficulty level:
Topic:
写一个查询语句,求出整数1到100之间排除55后的和
预计结果是4995
该如何写这个查询?
Solution:

    select sum(number) from (
    select number from master..spt_values
    where type = 'p' and number between 1 and 100 and number <> 55) a

Date:2021/7/28
Difficulty level:❤❤❤❤❤
Topic:
有如下一张表T
在这里插入图片描述

对上述进行排序后,把数据集合在一个字符串中输出,如果有不连续用 , 表示,如果连续显示 起始号-终止号
输出结果如下:
在这里插入图片描述
Solution:

--建表
if object_id('T','U') is not null drop table T
CREATE TABLE T
(
    val VARCHAR(50)
)
insert into T (val) values('A10000003')
insert into T (val) values('A10000001')
insert into T (val) values('A10000002')
insert into T (val) values('A10000011')
insert into T (val) values('A10000004')
insert into T (val) values('A10000006')
insert into T (val) values('A10000009')
insert into T (val) values('A10000010')
insert into T (val) values('A10000012')
--查询
select stuff (
    (select ',' + mi + case when mi = mx then '' else '-' +mx end from(
			select min(val) as mi,max(val) as mx,min(id) as id from(
				select * ,id - convert(int,substring(val,3,100)) as x from(
						select * , row_number() over(order by convert(int,substring(val,3,100))) as id
						from T)Y
			)A
			GROUP BY A.X
     )B
    ORDER BY ID
    FOR XML PATH ('')
        ),1,1,'') AS RESULT




Date:2021/6/28
Difficulty level:
Topic:
有如下一张表T
在这里插入图片描述

希望得到如下结果:
在这里插入图片描述

即相同品种,规格,颜色的数据行的数量进行汇总,同时合并他们汇总前的ID为IDs
Solution:



Date:2021/6/25
Difficulty level:
Topic:
有如下一张表T
在这里插入图片描述
希望按工号查找日期(RecDate)相同的记录数>1,且Rectime=Time4
预计结果如下:
在这里插入图片描述

Solution:

--建表
if object_id('T','U') is not null drop table T
CREATE TABLE T(
workid VARCHAR(20),
RecDate DATE,
RecTime VARCHAR(20),
Time4 VARCHAR(20)
)
INSERT INTO T VALUES ('161181','2021-05-03','13:01','13:01');
INSERT INTO T VALUES ('161181','2021-05-03','14:01','15:01');
INSERT INTO T VALUES ('161181','2021-05-06','13:01','13:01');
INSERT INTO T VALUES ('161181','2021-05-07','13:01','13:01');
INSERT INTO T VALUES ('161181','2021-05-08','13:01','13:01');
INSERT INTO T VALUES ('161181','2021-05-09','13:01','13:01');
--查询
select workid,RecDate,RecTime,Time4 from (
SELECT *,count(rectime) over(partition by RecDate ) as cnt FROM T ) a
where RecTime = Time4 and cnt > 1

Date:2021/6/24
Difficulty level:
Topic:
有如下一张表TA
在这里插入图片描述
TB
在这里插入图片描述
希望得到如下结果:
在这里插入图片描述

该如何写这个SQL?
Solution:

if object_id('TA','U') is not null drop table TA
CREATE TABLE TA
(
用户编号 VARCHAR(10),
用户地址 VARCHAR(20),
金额 INT
)
INSERT INTO TA VALUES
('001','花开村1号',10),
('002','花开村2号',15),
('003','花开村6号',15),
('004','花开村5号',16),
('005','花开村12号',8)
if object_id('TB','U') is not null drop table TB
CREATE TABLE TB
(
微信用户订单号 VARCHAR(10),
用户编号 VARCHAR(50)
)
INSERT INTO TB VALUES
('90002','001,002,004'),
('90003','005')
--方法一
select 用户编号,用户地址,金额,(select top 1 t2.微信用户订单号
    from TB t2
    where ',' + t2.用户编号 + ',' like '%' + t1.用户编号 + ',%') as 微信用户订单号
from TA t1
--方法二
select a.用户编号,用户地址,金额,b.微信用户订单号
from TA a
left join TB b
on ',' + b.用户编号 + ',' like '%' + a.用户编号 + ',%'



Date:2021/6/23
Difficulty level:
Topic:
有如下一张表T
在这里插入图片描述

希望得到如下结果:
在这里插入图片描述

该如何写这个SQL?
解释:同一个CODE组,DATE从小到大排序,需要实现每个日期到下一个日期的前一天作为结束日期,例如:CODE为1001组,第一个日期是2021-01-01,第二个日期是2021-03-02,那么第一个日期2021-01-01的结束日期就是2021-03-01,以此类推,如果是最后一个日期,那么结束日期默认为:9999-12-31
Solution:

--建表
if object_id('T','U') is not null drop table T
CREATE TABLE T
(
CODE INT,
INVTP VARCHAR(10),
DATE DATE
)
INSERT INTO T VALUES (1001,'A','2021/1/1');
INSERT INTO T VALUES (1001,'B','2021/3/2');
INSERT INTO T VALUES (1001,'C','2021/4/1');
INSERT INTO T VALUES (1002,'AA','2021/1/1');
INSERT INTO T VALUES (1002,'BB','2021/2/28');
INSERT INTO T VALUES (1003,'CC','2021/1/1');
--查询
alter table T ADD ID INT IDENTITY(1,1)
select a.CODE,a.INVTP,a.DATE as STARTDATE,CASE WHEN b.DATE IS NULL THEN '9999/12/31' else b.DATE END AS END_DATE
from T a
left join T b
on a.CODE = b.CODE and a.ID = B.ID -1


Date:2021/6/22
Difficulty level:
Topic:
有如下一张表T
在这里插入图片描述

挑选出满足以下规则的数据
规则如下: 同一类型的数据A_Type 按照A_NO的顺序 时间依次是变大的,如果时间有异常 ,则为条数异常的数据
如 id 为2的数据时间应该比id为3的数据小才对,但是比id为3的大则筛选出来,id为6,11都是同一规则,结果如下:
在这里插入图片描述
Solution:

--建表
if object_id('T','U') is not null drop table T
CREATE TABLE T(
    ID INT NULL,
    A_Type VARCHAR(50) NULL,
    A_NO INT NULL,
    A_Time DATETIME NULL
)
INSERT INTO T VALUES (1,'A',1,'2019/1/21')
INSERT INTO T VALUES (2,'A',2,'2019/1/27')
INSERT INTO T VALUES (3,'A',3,'2019/1/23')
INSERT INTO T VALUES (4,'A',4,'2019/1/24')
INSERT INTO T VALUES (5,'A',5,'2019/1/25')
INSERT INTO T VALUES (6,'B',1,'2019/5/25')
INSERT INTO T VALUES (7,'B',2,'2019/5/22')
INSERT INTO T VALUES (8,'B',3,'2019/5/23')
INSERT INTO T VALUES (9,'B',4,'2019/5/24')
INSERT INTO T VALUES (10,'C',1,'2019/6/12')
INSERT INTO T VALUES (11,'C',2,'2019/6/17')
INSERT INTO T VALUES (12,'C',3,'2019/6/14')
INSERT INTO T VALUES (13,'D',1,'2019/7/8')
INSERT INTO T VALUES (14,'D',2,'2019/7/9')
INSERT INTO T VALUES (15,'D',3,'2019/7/10')
INSERT INTO T VALUES (16,'D',4,'2019/7/11')
--查询
SELECT ID,A_Type,A_NO,A_Time FROM (
select a.* ,CASE WHEN A.A_TYPE = B.A_TYPE AND A.A_TIME> B.A_TIME
    THEN 1 ELSE 0 END AS JUDGE
FROM T A
LEFT JOIN T B
ON A.ID = B.ID -1) A
WHERE JUDGE = 1

Date:2021/6/17
Difficulty level:❤❤❤❤
Topic:
有一张表T,里面的数据如下:
在这里插入图片描述
希望得到如下结果
在这里插入图片描述

该如何写这个查询?
Solution:

--建表
if object_id('T','U') is not null drop table T
CREATE TABLE T
(ID INT,
PID INT
)
INSERT INTO T VALUES
(1,0),(2,1),(3,2),(4,3)
--查询
WITH CTE AS (
SELECT ID,PID,CAST(ID AS VARCHAR(1000)) AS PATH
FROM T
WHERE ID = 1
UNION ALL
SELECT A.ID,A.PID,CAST ((CTE.PATH + '->' + CAST(A.ID AS VARCHAR(10))) AS VARCHAR(1000)) AS PATH
FROM T A
INNER JOIN CTE ON A.PID = CTE.ID
)
select * from CTE



Date:2021/6/16
Difficulty level:
Topic:
怎么把下面的表 T
在这里插入图片描述

查成这样1个结果
在这里插入图片描述
Solution:

--建表
if object_id('T','U') is not null drop table T
CREATE TABLE T
(YEAR VARCHAR(10),
MONTH VARCHAR(10),
AMOUNT NUMERIC(18,1)
)
INSERT INTO T VALUES
('2020','1',9.1),
('2020','2',9.2),
('2020','3',9.3),
('2020','4',9.4),
('2021','1',8.1),
('2021','2',8.2),
('2021','3',8.3),
('2021','4',8.4)
--方法一
select a.YEAR,a.AMOUNT as M1,b.AMOUNT as M2,c.AMOUNT as M3,d.AMOUNT as M4
FROM T a
left join T b
on  a.Year = b.Year and b.Month = 2
left join T c
on  a.Year = c.Year and c.Month = 3
left join T d
on  a.Year = d.Year and d.Month = 4
where a.MONTH = 1
--方法二
select YEAR,[1] as M1,[2] as M2,[3] as M3,[4] as M4
from T
pivot(sum(Amount) for month in([1] ,[2] ,[3] ,[4] )) b



Date:2021/6/11
Difficulty level:❤❤❤
Topic:
有如下一张表T
在这里插入图片描述

要求
当Num中的数据同时大于上下两行数据,返回是
当Num中的数据小于上下两行数据中的任何一行,返回否

例如:11大于5,11大于0,所以返回是
5小于11所以返回否
预期的结果如下:
在这里插入图片描述

该如何写这个查询?
Solution:

--建表
if object_id('T','U') is not null drop table T
CREATE TABLE T (
ID INT,
Num INT
);
INSERT INTO T VALUES(1,5);
INSERT INTO T VALUES(2,11);
INSERT INTO T VALUES(3,0);
INSERT INTO T VALUES(4,-2);
INSERT INTO T VALUES(5,2);
INSERT INTO T VALUES(6,9);
INSERT INTO T VALUES(7,1);
INSERT INTO T VALUES(8,-4);
INSERT INTO T VALUES(9,-7);
--查询
select A.*,case when a.NUM > b.NUM and a.NUM > c.NUM
    then '是' else '否'  end as Result
from T a
left join T b
on a.ID = b.ID + 1
left join T c
on a.ID = C.ID - 1



Date:2021/6/10
Difficulty level:❤❤❤❤
Topic:
有如下一张表T
在这里插入图片描述
求出NAME中每组累加/每组总数的比例大于0.6的ID和NAME
预期的结果应该为
在这里插入图片描述

解释:从题目意思可以看出关羽组的总数为14,从ID为1到5分别累加后的结果分别为1,3,9,11,14,只有9,11,14除以总数14才大于0.6,所以返回的结果ID为3,4,5,同样曹操组为7和8
Solution:

--建表
if object_id('T','U') is not null drop table T
CREATE TABLE T
(
ID INT,
NAME VARCHAR(10),
NUM INT
)
INSERT INTO T VALUES
(1,'关羽',1),
(2,'关羽',2),
(3,'关羽',6),
(4,'关羽',2),
(5,'关羽',3),
(6,'曹操',2),
(7,'曹操',3),
(8,'曹操',3)
--查询
SELECT * FROM T
select ID,NAME,NUM FROM (
select ID,NAME,NUM,SUM(NUM) OVER(PARTITION BY NAME ORDER BY ID )*1.0/SUM(NUM) OVER(PARTITION BY NAME) as Per
FROM T
GROUP BY NAME, ID,NUM
) a
where Per > 0.6



Date:2021/6/7
Difficulty level:❤❤
Topic:
给如下两个表,写一个查询语句,求出在每一个工资发放日,每个部门的平均工资与公司的平均工资的比较结果 (高 / 低 / 相同)。
表:TA(工资表)
在这里插入图片描述

其中employee_id 字段是下表 TB(员工表)中 employee_id 字段的外键。
在这里插入图片描述

对于如上样例数据,结果为:
在这里插入图片描述

解释
在5月,公司的平均工资是 (9000+6000+10000)/3 = 8333.33…
由于部门 ‘1’ 里只有一个 employee_id 为 ‘1’ 的员工,所以部门 ‘1’ 的平均工资就是此人的工资 9000 。因为 9000 > 8333.33 ,所以比较结果是 ‘higher’。第二个部门的平均工资为 employee_id 为 ‘2’ 和 ‘3’ 两个人的平均工资,为 (6000+10000)/2=8000 。因为 8000 < 8333.33 ,所以比较结果是 ‘lower’ 。在4月用同样的公式求平均工资并比较,比较结果为 ‘same’ ,因为部门 ‘1’ 和部门 ‘2’ 的平均工资与公司的平均工资相同,都是 7000 。
Solution:

--建表
if object_id('TA','U') is not null drop table TA
CREATE TABLE TA
(
ID INT,
Employee_ID INT,
Amount INT,
Pay_Date DATE
)
INSERT INTO TA VALUES
(1,1,9000,'2021-05-31'),
(2,2,6000,'2021-05-31'),
(3,3,10000,'2021-05-31'),
(4,1,7000,'2021-04-30'),
(5,2,6000,'2021-04-30'),
(6,3,8000,'2021-04-30')
if object_id('TB','U') is not null drop table TB
CREATE TABLE TB
(
Employee_ID INT,
Department_ID INT
)
INSERT INTO TB VALUES
(1,1),
(2,2),
(3,2)
--查询
select Pay_Month,Department_ID
     ,case when D_AVGAmount = C_AVGAmount then 'SAME'
when D_AVGAmount < C_AVGAmount then 'LOWER' else 'HIGHER' end as COMPARISION
from (
                  select distinct LEFT(Pay_Date, 7)                                                          as Pay_Month
                                , b.Department_ID
                                , sum(Amount) over (partition by LEFT(Pay_Date, 7),b.Department_ID) /
                                  count(a.Employee_ID)
                                        over (partition by LEFT(Pay_Date, 7),b.Department_ID)                as D_AVGAmount
                                , sum(Amount) over (partition by LEFT(Pay_Date, 7)) /
                                  count(a.Employee_ID) over (partition by LEFT(Pay_Date, 7))                 as C_AVGAmount
                  from TA a
                           left join TB b
                                     on a.Employee_ID = b.Employee_ID
                  group by LEFT(Pay_Date, 7), b.Department_ID, Amount, a.Employee_ID
              ) a





Date:2021/6/4
Difficulty level:
Topic:
有如下两张表
表TA
在这里插入图片描述

表TB
在这里插入图片描述

id 是自动递增的主键,CandidateId 是 T0604A 表中的 id.
请编写 sql 语句来找到当选者的名字,即选票最多的候选者。上面的例子将返回当选者 B,因为他获得了2票,其他人获得了1票或0票。
在这里插入图片描述
注意:你可以假设没有平局,换言之,最多只有一位当选者。
Solution:

--建表
IF OBJECT_ID('TA') IS NOT NULL DROP TABLE TA
CREATE TABLE TA
(
ID INT,
Name VARCHAR(10)
)
INSERT INTO TA VALUES
(1,'A'),
(2,'B'),
(3,'C'),
(4,'D'),
(5,'E')
if object_id('TB','U') is not null drop table TB
CREATE TABLE TB
(
ID INT,
CandidateID INT
)
INSERT INTO TB VALUES
(1,2),
(2,4),
(3,3),
(4,2),
(5,5)
--查询
select Name from TA WHERE ID = (
SELECT CandidateID FROM (
select CandidateID,COUNT(*)  as cnt ,row_number() over(order by count(*) DESC) as rnk
FROM TB
GROUP BY CANDIDATEID) A
WHERE RNK = 1)



Date:2021/6/1
Difficulty level:❤❤
Topic:
有如下一张表T其中ID是自增长
在这里插入图片描述
求解,如何将相邻两条记录的Name进行位置交换?预期结果如下:
在这里插入图片描述

其中,最后一条记录如果是奇数则不交换

--建表
if object_id('T','U') is not null drop table T
CREATE TABLE T
(
ID INT,
NAMES VARCHAR(20)
)
INSERT INTO T VALUES
(1,'刘备'),
(2,'张飞'),
(3,'关羽'),
(4,'赵云'),
(5,'马超')
--查询
SELECT A.ID,CASE WHEN B.NAMES IS NULL THEN A.NAMES ELSE B.NAMES END AS NAMES FROM (
                          select A.*, case when ID % 2 = 1 THEN ID + 1 ELSE ID - 1 END AS ID2
                          from T a
                      ) A
LEFT JOIN T B
ON A.ID2 = B.ID

Date:2021/5/31
Difficulty level:
Topic:
有如下一张表T
在这里插入图片描述

想得到如下结果:
在这里插入图片描述

该如何写查询?解释:求解A列中每组的和得到B,当C列的组内数据不同返回1,相同则返回他们相同的值。
要求:使用两种方法求解
Solution:

--建表
if object_id('T','U') is not null drop table T
CREATE TABLE T
(
A VARCHAR(10),
B INT,
C VARCHAR(10)
)
INSERT INTO T VALUES
('aaa',1,'X'),
('aaa',2,'Y'),
('bbb',3,'X'),
('bbb',4,'X'),
('ccc',5,'Y'),
('ccc',6,'Y')
--查询
select distinct A,sum(B) over(partition by A) as B,CASE WHEN A IN (
select distinct A from (
select distinct A,C,COUNT(*) OVER ( PARTITION BY A ) as cnt from T
GROUP BY A,C) a
where cnt > 1) THEN cast(1 as varchar(2)) ELSE C END AS C
FROM T

Date:2021/5/28
Difficulty level:
Topic:
有如下一张表
T表:
在这里插入图片描述
写一条SQL查询语句获取合作过至少三次的演员和导演的id对(actor_id,director_id)
预计结果:
在这里插入图片描述
唯一的id对是(1,1),他们恰好合作了3次
Solution:

--数据准备
if object_id('T','U') is not null drop table T
CREATE TABLE T
(
actor_id INT,
director_id INT,
timestamps INT
)
INSERT INTO T VALUES
(1,1,0),
(1,1,1),
(1,1,2),
(1,2,3),
(1,2,4),
(2,1,5),
(2,1,6)
--查询
select distinct ACTOR_ID, DIRECTOR_ID from(
select ACTOR_ID, DIRECTOR_ID, TIMESTAMPS
     ,count(TIMESTAMPS) over (PARTITION BY actor_id,director_id ) as cnt from T
group by actor_id,director_id, TIMESTAMPS) a
where cnt >= 3


Date:2021/3/26
Difficulty level:
Topic:
有如下一张T 表:
在这里插入图片描述
其中games_played是玩家登陆玩的游戏数量,
查询每个玩家每天累计玩的游戏数量有多少?结果如下:
在这里插入图片描述

解释:玩家1第一次玩了5个,所以是5,第二次是6个,所以累计就是5+6=11,第三次是1个,累计就是5+6+1=12
玩家2类似
第三次是1个,累计就是5+6+1=12
玩家2类似
Solution:

if object_id('T','U') is not null drop table T
CREATE TABLE T
(
player_id INT,
device_id INT,
event_date DATE,
games_played INT
)
INSERT INTO T VALUES (1,2,'2016-03-01',5)
INSERT INTO T VALUES (1,2,'2016-05-02',6)
INSERT INTO T VALUES (1,3,'2016-06-25',1)
INSERT INTO T VALUES (3,1,'2016-03-02',0)
INSERT INTO T VALUES (3,4,'2016-07-03',5)
select * from T




Date:2021/3/18
Difficulty level:
Topic:
给定一个 T表,编写一个 SQL 查询,来查找与之前(昨天的)日期相比温度更高的所有日期的 Id。
在这里插入图片描述
例如,根据上述给定的 T 表格,返回如下 Id:
在这里插入图片描述
Solution:

if object_id('T','U') is not null drop table T
CREATE TABLE T (
ID INT,
REDATE DATE,
TEMP INT)
INSERT INTO T VALUES (1,'2020-1-1',10);
INSERT INTO T VALUES (2,'2020-1-2',18);
INSERT INTO T VALUES (3,'2020-1-3',15);
INSERT INTO T VALUES (4,'2020-1-4',20);
select * from T
select distinct b.ID from T a
left join T b
on a.ID = b.ID-1
WHERE b.TEMP > a.TEMP



Date:2021/3/4
Difficulty level:❤❤
Topic:
有如下一张表T
在这里插入图片描述
挑选出带有选中字样的数据
规则如下: 同一类型的数据A_Type 按照A_NO的顺序 时间依次是变大的,如果时间有异常 ,则为条数异常的数据
如 id 为2的数据时间应该比id为3的数据小才对,但是比id为3的大则筛选出来,id为6,11都是同一规则,结果如下:
在这里插入图片描述
Solution:





Date:2021/3/1
Difficulty level:❤❤
Topic:
有这样一组数据,这只是其中一个单号的
在这里插入图片描述
希望按单号+工序排序,相邻行部门相同的情况,取工序号最大的那一行记录?
在这里插入图片描述
Solution:




Date:2021/2/26
Difficulty level:❤❤
Topic:
编写一个自定义函数,判断2021年是否为闰年?
例如 select fn_year(2021)
返回结果:FALSE
Solution:

create function fn_leapyear(@year int)
returns varchar(10)
begin
    declare @sql varchar(10)
    set @sql = case when @year%4=0 and @year%100<>0 or @year%400=0
    then  'True' else 'False' end
    return (@sql)
end
select dbo.fn_leapyear(2020)

Date:2021/2/25
Difficulty level:
Topic:
有如下一张表T
在这里插入图片描述
列AID和BID是一对多的关系,希望将BID中同时存在3和5的AID找出来,预计的结果如下:
在这里插入图片描述
Solution:

--建表
if object_id('T','U') is not null drop table T
CREATE TABLE T
(
AID INT,
BID INT
)
INSERT INTO T VALUES (1,2);
INSERT INTO T VALUES (1,5);
INSERT INTO T VALUES (2,1);
INSERT INTO T VALUES (2,3);
INSERT INTO T VALUES (2,5);
INSERT INTO T VALUES (3,4);
INSERT INTO T VALUES (3,2);
INSERT INTO T VALUES (3,5);
--查询表格
select * from T
SELECT distinct AID FROM (
SELECT *,sum(fuzhu) over(partition by AID) as sumfuzhu FROM (
select *,case WHEN BID = 3 THEN 1 WHEN BID = 5 THEN 2 ELSE 0 END AS FUZHU
FROM T) A) A
where sumfuzhu >= 3

Date:2021/2/24
Difficulty level:❤❤❤❤
Topic:
有如下一张表T
在这里插入图片描述
需要统计每组(NAME)连续时间(TIME)内的连续完成数(COMPLETE),其中有某一时间的完成数为0就重新计算。预计结果如下:
在这里插入图片描述
该如何写这个SQL?

if object_id('T','U') is not null drop table T
CREATE TABLE T
(TIME INT,
 NAME VARCHAR(5),
 COMPLETE VARCHAR(5)
)
INSERT INTO T VALUES(1,'1','0');
INSERT INTO T VALUES(2,'1','1');
INSERT INTO T VALUES(3,'1','1');
INSERT INTO T VALUES(4,'1','1');
INSERT INTO T VALUES(5,'1','0');
INSERT INTO T VALUES(6,'1','0');
INSERT INTO T VALUES(7,'1','1');
INSERT INTO T VALUES(8,'1','1');
INSERT INTO T VALUES(2,'3','1');
INSERT INTO T VALUES(3,'3','1');
INSERT INTO T VALUES(4,'3','1');
INSERT INTO T VALUES(5,'3','0');
INSERT INTO T VALUES(6,'3','1');
INSERT INTO T VALUES(7,'3','1');
INSERT INTO T VALUES(8,'3','0' );
select * from T
SELECT a.TIME,a.NAME,a.COMPLETE,(CASE a.COMPLETE WHEN 0 THEN 0 ELSE a.T END) as Result
FROM
(
    SELECT *,ROW_NUMBER() OVER(PARTITION BY NAME,COMPLETE,W ORDER BY TIME) AS T  FROM
    (
        SELECT *,(TIME-ROW_NUMBER() OVER(PARTITION BY NAME,COMPLETE ORDER BY TIME)) AS W
        FROM T
    )b
)a ORDER BY a.NAME,a.TIME


Date:2021/2/23
Difficulty level:
Topic:
有如下一张表T
在这里插入图片描述
希望能够将地址中的数字替换成*,来保护数据。预期的结果应该为
在这里插入图片描述
Solution:

if object_id('T','U') is not null drop table T
CREATE TABLE T (地址 VARCHAR(100))
INSERT INTO T VALUES('北京市东城区273号201房');
INSERT INTO T VALUES('广州市天河区11号1311房');
INSERT INTO T VALUES('深圳市福田区992号121房');
declare @i int
set @i = 0
while @i <= 9
begin
    update T
    SET 地址 = replace(地址,@i,'*')
    set @i = @i + 1
end
SELECT * FROM T

Date:2021/2/22
Difficulty level:
Topic:
有如下三张表TA(仓库期初)
在这里插入图片描述

TB(仓库发出)
在这里插入图片描述
TC(仓库收入)
在这里插入图片描述
要求得到如下结果:
在这里插入图片描述
该如何写这个SQL?

SELECT coalesce(a.WAREHOUSE,b.WAREHOUSE,c.WAREHOUSE ) as 仓库
     ,coalesce(a.Item,b.Item,c.Item ) as 产品
     ,isnull(a.QTY,0) as 期初
,isnull(b.QTY,0) as 发出,isnull(c.QTY,0) as 收入
,isnull(isnull(a.QTY,0)-isnull(b.QTY,0)+isnull(C.QTY,0),0) as 结余
from TA a
full join TB b
on a.WAREHOUSE = b.WAREHOUSE and a.Item = b.Item
full join TC c
on a.WAREHOUSE = c.WAREHOUSE and a.Item = c.Item


Date:2021/2/20
Difficulty level:❤❤
Topic:
定义如下两个变量
DECLARE @date_start datetime
DECLARE @date_end datetime
set @date_start = ‘2021-02-20 01:00:00’
set @date_end = '2021-02-20 10:00:00’希望求解出两个变量直接每小时的时间分布,预计结果如下:
在这里插入图片描述
Solution:

declare @date_start datetime
declare @date_end datetime
set  @date_start = '2021-02-20 01:00:00'
set  @date_end = '2021-02-20 10:00:00'
if object_id('T','U') is not null drop table T
select @date_start as work_date into T
declare @cnt int ,@i int
set @cnt = datediff(hour,@date_start,@date_end)
set @i = 1
while @i <= @cnt
begin
    insert into T
    select dateadd(hour,@i,@date_start)
    set @i = @i + 1
end
select * from T


Date:2021/2/5
Difficulty level:
Topic:
有如下两张表TA,表TB
在这里插入图片描述
在这里插入图片描述
希望得到如下结果:
在这里插入图片描述
anum表示每个人参加的项目数,bnum表示每个人在各自项目中胜利的次数该如何写这个查询?
Solution:

--建表
if object_id('TA','U') is not null drop table TA
CREATE TABLE TA (
A VARCHAR(20),
B VARCHAR(20)
)
INSERT INTO TA VALUES('跑步','张三');
INSERT INTO TA VALUES('游泳','张三');
INSERT INTO TA VALUES('跳远','李四');
INSERT INTO TA VALUES('跳高','王五');
if object_id('TB') is not null drop table TB
CREATE TABLE TB (
A VARCHAR(20),
B VARCHAR(20),
C VARCHAR(10)
)
INSERT INTO TB VALUES('跑步','张三','胜');
INSERT INTO TB VALUES('游泳','张三','胜');
INSERT INTO TB VALUES('跳高','王五','胜');
select * from TA
select * from TB
--查询
select distinct a.B,isnull(b.anum,0) as anum,isnull(c.bnum,0) as bnum
from TA a
left join (
select B,count(*) as anum from TA
group by B) b
on a.B = b.B
left join (
select B,COUNT(*) as bnum from TB
group by B) c
on a.B = c.B



Date:2021/2/4
Difficulty level:
Topic:
有如下一张表T
在这里插入图片描述
要求当Num中的数据同时大于上下两行数据,返回是;当Num中的数据小于上下两行数据中的任何一行,返回否
例如:11大于5,11大于0,所以返回是5小于11所以返回否
预期的结果如下:
在这里插入图片描述
该如何写这个查询?
Solution:

--建表
if object_id('T','U') is not null drop table T
CREATE TABLE T (
ID INT,
Num INT
);
INSERT INTO T VALUES(1,5);
INSERT INTO T VALUES(2,11);
INSERT INTO T VALUES(3,0);
INSERT INTO T VALUES(4,-2);
INSERT INTO T VALUES(5,2);
INSERT INTO T VALUES(6,9);
INSERT INTO T VALUES(7,1);
INSERT INTO T VALUES(8,-4);
INSERT INTO T VALUES(9,-7);
select * from T
--查询
select ID,Num,case when Num < upone or Num < nextone then '否'
when Num > upone and Num >nextone then '是' end as Result from (
select a.*,b.Num as upone,c.Num as nextone from  T a
left join T b
on a.ID = b.ID + 1
left join T c
on a.ID = C.ID -1 ) a



Date:2021/2/2
Difficulty level:
Topic:
给定一个表 T,id 是树节点的编号, pid 是它父节点的 id 。
在这里插入图片描述
树中每个节点属于以下三种类型之一:叶子:如果这个节点没有任何孩子节点。根:如果这个节点是整棵树的根,即没有父节点。内部节点:如果这个节点既不是叶子节点也不是根节点。

写一个查询语句,输出所有节点的编号和节点的类型,并将结果按照节点编号排序。上面样例的结果为:
在这里插入图片描述

节点 ‘1’ 是根节点,因为它的父节点是 NULL ,同时它有孩子节点 ‘2’ 和 ‘3’ 。节点 ‘2’ 是内部节点,因为它有父节点 ‘1’ ,也有孩子节点 ‘4’ 和 ‘5’ 。节点 ‘3’, ‘4’ 和 ‘5’ 都是叶子节点,因为它们都有父节点同时没有孩子节点。注意如果树中只有一个节点,你只需要输出它的根属性。
Solution:

--建表
if object_id('T','U') is not null drop table T
CREATE TABLE T(ID INT,PID INT);
INSERT INTO T VALUES (1,null);
INSERT INTO T VALUES (2,1);
INSERT INTO T VALUES (3,1);
INSERT INTO T VALUES (4,2);
INSERT INTO T VALUES (5,2);
--查询
select ID,CASE WHEN PID IS NULL THEN 'Root'
    when ID not in (SELECT DISTiNCT PID FROM T WHERE PID IS NOT NULL) THEN 'Leaf'
    else 'Inner' end as Type
from T


Date:2021/2/1
Difficulty level:❤❤
Topic:
有如下一张表T
在这里插入图片描述

每天上午8:00-9:00,下午16:30-18:00这两个时间段内的最早的一条记录视为“有效”,在这两个时间段内其它打卡数据显示“重复”,否则视为“无效”。预计结果如下:
在这里插入图片描述
Solution:

select userid,CheckIn
     ,case when shiduan = '无效时间段' then '无效' when rnk = 1 then '有效' else '重复' end as 状态
from (
         select *, dense_rank() over ( partition by userid,riqi,shiduan order by datetime) as rnk
         from (
                  select *
                       , convert(date, checkin, 112)        as riqi
                       , CONVERT(varchar(100), CheckIn, 24) as datetime
                       , case
                             when CONVERT(varchar(100), CheckIn, 24) < '08:00:00' and (
                                     CONVERT(varchar(100), CheckIn, 24) > '09:00:00' or
                                     CONVERT(varchar(100), CheckIn, 24) < '16:30:00') or
                                  CONVERT(varchar(100), CheckIn, 24) > '18:00:00' then '无效时间段'
                             when CONVERT(varchar(100), CheckIn, 24) between '08:00:00' and '09:00:00' then '上午有效时间段'
                             when CONVERT(varchar(100), CheckIn, 24) between '16:30:00' and '18:00:00' then '下午有效时间段'
                      end                                   as shiduan
                  from T) a
     ) a



Date:2021/1/26
Difficulty level:❤❤
Topic:
有如下2张表TA发药信息表
在这里插入图片描述
TB购进记录表
在这里插入图片描述
某医院系统卖给患者阿莫西林X数量后去下购进记录的库存,购进记录可能是零散的。现在按iilszh排序,优先iilszh小的,依次下库存如何得到类似下面的结果集:
在这里插入图片描述
Solution:






Date:2021/1/22
Difficulty level:❤❤
Topic:
有如下2张表TA
在这里插入图片描述
TB
在这里插入图片描述
希望把表TA的Charg随机分配到表TB里面,但是数量得对上,比如表TA的N1对应的QTY是3,则表TB只随机分配3个serial_number过去。两个表的关联关系为HU字段,表TA的QTY合计一定是表TB的条数,预计其中一种结果如下:在这里插入图片描述
Solution:




Date:2021/1/21
Difficulty level:❤❤
Topic:
有如下1张表T
在这里插入图片描述
希望将每个月之前的月份进行累加,例如二月份的total=10+20,三月份的total=10+20+30,四月份的total=10+20+30+50,以此类推。预计结果如下:
在这里插入图片描述
该如何写这个SQL?
要求:不使用SUM开窗函数
Solution:

if object_id('T','U') is not null drop table T
CREATE TABLE T(
month varchar(23),
total int
);
INSERT INTO T VALUES ('一月份',10);
INSERT INTO T VALUES ('二月份',20);
INSERT INTO T VALUES ('三月份',30);
INSERT INTO T VALUES ('四月份',50);
INSERT INTO T VALUES ('五月份',40);
INSERT INTO T VALUES ('六月份',20);
INSERT INTO T VALUES ('七月份',30);
select * from T
alter table T ADD ID INT IDENTITY
select month,(select sum(total) from T b where b.id <= a.id ) as total
from  T a



Date:2021/1/20
Difficulty level:
Topic:
有如下1张表T
在这里插入图片描述
其中Amount字段是每个人同一月份,不同状态的金额总和,需要对相同月份的数据均分Amount,得到如下结果:在这里插入图片描述
该如何写这个SQL?
Solution:

if object_id('T','U') is not null drop table T
CREATE TABLE T
(ID int,
NAME varchar(22),
MON int,
STATE varchar(21),
AMOUNT int
);
INSERT INTO T VALUES(1,'张三',201901,'A',9000);
INSERT INTO T VALUES(2,'张三',201901,'B',9000);
INSERT INTO T VALUES(3,'张三',201901,'E',9000);
INSERT INTO T VALUES(4,'李四',201902,'A',1800);
INSERT INTO T VALUES(5,'李四',201902,'C',1800);
INSERT INTO T VALUES(6,'王五',201902,'C',30000);
INSERT INTO T VALUES(7,'王五',201902,'F',30000);
select * from T
select ID,NAME,MON,STATE,AMOUNT / count(MON) over ( partition by name ) AS AMOUNT
from T
order by ID


Date:2021/1/19
Difficulty level:❤❤
Topic:
有如下3张表
其中TC,这张为客户表
在这里插入图片描述
TX,这张为X业务应收金额表
在这里插入图片描述
TY,这张为Y业务应收金额表
在这里插入图片描述
现在需要将每个客户按月生成汇总报表,用SQL该如何求解?
在这里插入图片描述
Solution:

if object_id('TC','U') is not null drop table TC
Create table TC(
客户编号 varchar(24),
客户抬头 varchar(23)
)
Insert INTO TC VALUES('0001','A公司');
Insert INTO TC VALUES('0002','B公司');
Insert INTO TC VALUES('0003','C公司');
if object_id('TX','U') is not null drop table TX
Create table TX(
客户编号 varchar(24),
日期 Date,
金额 int
)
Insert INTO TX VALUES('0001','2018-9-12',2000);
Insert INTO TX VALUES('0001','2018-9-16',1500);
Insert INTO TX VALUES('0001','2018-10-23',3000);
Insert INTO TX VALUES('0002','2018-9-15',3200);
Insert INTO TX VALUES('0002','2018-10-19',5000);
if object_id('TY','U') is not null drop table TY
Create table TY(
客户编号 varchar(24),
日期 Date,
金额 int
)
Insert INTO TY VALUES('0001','2018-9-12',12000);
Insert INTO TY VALUES('0001','2018-10-16',10000);
Insert INTO TY VALUES('0001','2018-10-23',20000);
Insert INTO TY VALUES('0002','2018-11-15',13200);
Insert INTO TY VALUES('0002','2018-10-19',25000);
with t0121 as (
select a.*,b.客户抬头,'X' as yewu,left(日期,7) as 月份 from TX a
left join TC b
on a.客户编号 = b.客户编号
union all
select a.*,b.客户抬头,'Y' as yewu,left(日期,7) as 月份 from TY a
left join TC b
on a.客户编号 = b.客户编号)
select distinct a.月份 as 日期,a.客户抬头
     ,b.金额
     ,c.金额
from t0121 a
left join (select distinct 月份,客户抬头,sum(金额) over(partition by 月份,客户抬头) as 金额
FROM t0121
where yewu = 'X'
group by 月份,客户抬头,金额 ) b
on a.月份 = b.月份 and a.客户抬头 = b.客户抬头
left join (select distinct 月份,客户抬头,sum(金额) over(partition by 月份,客户抬头) as 金额
FROM t0121
where yewu = 'Y'
group by 月份,客户抬头,金额 )c
on a.月份 = c.月份 and a.客户抬头 = c.客户抬头

Date:2021/1/7
Difficulty level:❤❤
Topic:
在 微信 或者 QQ这样的社交应用中,人们经常会发好友申请也会收到其他人的好友申请。
表 T0107 存储了所有好友申请通过的数据记录,其中, requester_id 和 accepter_id 都是用户的编号。
在这里插入图片描述
写一个查询语句,求出谁拥有最多的好友和他拥有的好友数目。对于上面的样例数据,结果为:
在这里插入图片描述
Solution

if object_id('T','U')is not null drop table T
CREATE TABLE T
(
requester_id INT,
accepter_id INT,
accept_date DATE
)
INSERT INTO T VALUES (1,2,'2016-6-3');
INSERT INTO T VALUES (1,3,'2016-6-8');
INSERT INTO T VALUES (2,3,'2016-6-8');
INSERT INTO T VALUES (3,4,'2016-6-9');
--本题难点是好友数目包括别人向自己申请,也包括自己向他人申请。
SELECT ID,NUM FROM
(SELECT ID,NUM,RANK()OVER(ORDER BY NUM DESC) AS RK FROM
(SELECT ID,COUNT(*) AS NUM FROM
(SELECT REQUESTER_ID AS ID FROM T
UNION ALL
SELECT ACCEPTER_ID AS ID FROM T)A
GROUP BY ID)B
)C
WHERE RK =1

Date:2021/1/6
Difficulty level:
Topic:
表如下,ID为自增,查询出第一条开始到第几条记录 的累计金额刚好超过100?
在这里插入图片描述
要求:不能使用开窗函数


Date:2021/1/4
Difficulty level:
Topic:
有如下一组数据
在这里插入图片描述
求出NAME中每组累加/每组总数的比例大于0.6的ID和NAME

预期的结果应该为
在这里插入图片描述

解释:从题目意思可以看出A组的总数为16,从ID为1到5分别累加后的结果分别为1,3,9,13,16,只有13和16除以总数16才大于0.6,所以返回的结果ID为4和5,同样B组为7和8
Solution:

if object_id('T','U') is not null drop table T
CREATE TABLE T
(
ID INT,
NAME VARCHAR(10),
NUM INT
)
INSERT INTO T VALUES (1,'A',1);
INSERT INTO T VALUES (2,'A',2);
INSERT INTO T VALUES (3,'A',6);
INSERT INTO T VALUES (4,'A',4);
INSERT INTO T VALUES (5,'A',3);
INSERT INTO T VALUES (6,'B',2);
INSERT INTO T VALUES (7,'B',8);
INSERT INTO T VALUES (8,'B',2);
select * from (
                  select a.*, (select sum(num) from T b where a.name = b.name and b.ID <= a.ID) as leiji
                       , sum(num) over (partition by name) as sum
                  from T a
              ) a
where leiji > 0.6 * sum

Date:2020/12/31
Difficulty level:
Topic:
有如下一张表T
在这里插入图片描述
希望得到如下结果
在这里插入图片描述
描述: 如果某列的字段在该日期为空值,查询时结果显示为之前最接近日期的非空值。
Solution:




Date:2020/12/30
Difficulty level:
Topic:
有如下一张表T
在这里插入图片描述

希望得到如下结果
在这里插入图片描述

该如何写这个SQL?
Solution:

if object_id('T','U') is not null drop table T
CREATE TABLE T
(
ID INT,
Cname VARCHAR(20),
ParentID INT,
OrgID INT,
Type INT
)
INSERT INTO T VALUES (1,'公司总部',0,0,1);
INSERT INTO T VALUES (2,'人事部',1,1,2);
INSERT INTO T VALUES (3,'张三',2,1,3);
INSERT INTO T VALUES (4,'财物部',1,1,2);
INSERT INTO T VALUES (5,'李四',4,1,3);
select * from T
select a.ID,a.Cname,b.Cname as OrgName,c.Cname as DeptName
from T a
left join T b
on b.ID = a.OrgID
left join T c
on c.ID = a.ParentID
where a.Type = 3

Date:2020/12/29
Review index:❤❤❤
Topic:
有如下一张
T 表:
在这里插入图片描述

其中games_played是玩家登陆玩的游戏数量,
查询每个玩家每天累计玩的游戏数量有多少?结果如下:
在这里插入图片描述

解释:玩家1第一次玩了5个,所以是5,第二次是6个,所以累计就是5+6=11,
第三次是1个,累计就是5+6+1=12
玩家2类似
要求:不能使用开窗函数
Solution:

if object_id('T','U')is not null drop table T
create table T (
    play_id int,
    device_id int,
    event_date date,
    games_played int
)
insert into T
values
(1,2,'2016-03-01',5),
(1,2,'2016-05-02',6),
(1,3,'2017-06-25',1),
(3,1,'2016-03-02',0),
(3,4,'2018-07-03',5)
select * from T
SELECT play_id,event_date,(SELECT SUM(games_played)
FROM (select *,row_number() over(partition by play_id order by play_id,event_date) as rnk from T) B
WHERE a.play_id = b.play_id and B.rnk<=A.rnk)as games_played
FROM (select *,row_number() over(partition by play_id order by play_id,event_date) as rnk from T) A



Date:2020/12/28
Review index:
Topic:
有如下三种表及表结构:T1(stuID,classID,stuName),分别对应学生编号,班级编号,学生姓名
在这里插入图片描述

T2(classID,className),分别对应班级编号,班级名称
在这里插入图片描述

T3(stuID,course,score),分别对应学生编号,课程名称,考试成绩
在这里插入图片描述

查询一班各科成绩最高的学生姓名?
Solution:

if object_id('T1','U') is not null drop table T1
CREATE TABLE T1(
stuID INT,
classID VARCHAR(10),
stuName VARCHAR(20)
)
INSERT INTO T1 VALUES(1,'A','zhang');
INSERT INTO T1 VALUES(2,'A','li');
INSERT INTO T1 VALUES(3,'B','wang');
if object_id('T2','U') is not null drop table T2
CREATE TABLE T2
(
classID VARCHAR(10),
className VARCHAR(20)
)
INSERT INTO T2 VALUES('A','一班');
INSERT INTO T2 VALUES('B','二班');
if object_id('T3','U')IS NOT NULL DROP TABLE T3
CREATE TABLE T3
(
stuID INT,
course VARCHAR(20),
score INT
)
INSERT INTO T3 VALUES (1,'语文',80);
INSERT INTO T3 VALUES (1,'数学',90);
INSERT INTO T3 VALUES (1,'英语',70);
INSERT INTO T3 VALUES (2,'语文',89);
INSERT INTO T3 VALUES (2,'数学',91);
INSERT INTO T3 VALUES (2,'英语',88);
INSERT INTO T3 VALUES (3,'语文',75);
INSERT INTO T3 VALUES (3,'数学',77);
INSERT INTO T3 VALUES (3,'英语',72);
--select * from T1
--SELECT * FROM T2
--SELECT * FROM T3
select  course,stuname
from(select b.classID,b.stuname,a.*
          ,row_number() over (partition by a.course order by score desc) as rnk from T3 a
LEFT JOIN T1 b
ON a.stuID = b.stuID
left join T2 C
ON B.classID = C.classID
where c.className = '一班') a
where rnk = 1

Date:2020/12/24
Review index:❤❤❤❤
Topic:
有如下一张表T
在这里插入图片描述
希望每条记录每次增加30分钟,增加3次预计得到的结果如下:
在这里插入图片描述
Solution:

if object_id('T','U')is not null drop table T
CREATE TABLE T
(
ID INT,
EndTime DATETIME
)
INSERT INTO T VALUES (1,'2020/5/26 16:00');
INSERT INTO T VALUES (2,'2020/5/26 17:30');
alter table T add num int not null default 1
declare @EndTime1 datetime
select @EndTime1 = cast(EndTime as datetime) from T where ID = 1
declare @EndTime2 datetime
select @EndTime2 = cast(EndTime as datetime) from T where ID = 2
declare @cnt int
set @cnt = 1
while @cnt <= 3
begin
     insert into T
        select cast(1 as int) ,cast(dateadd(mi,30*@cnt,@EndTime1) as datetime),@cnt+1;
  insert into T
        select cast(2 as int) ,cast(dateadd(mi,30*@cnt,@EndTime2) as datetime),@cnt+1;
    set @cnt = @cnt + 1
end
select * from  T
order by id,num



Date:2020/12/23
Review index:
Topic:
有如下一张表T
在这里插入图片描述
根据客单类别表统计出每个省份每个城市的低客单数和高客单数,如果某城市无低客单记录或高客单记录,其统计数为0

要求:通过一条sql语句得到下列结果
在这里插入图片描述
Solution:

if object_id('T','U')is not null drop table T
CREATE TABLE T (
姓名 VARCHAR(20),
省份 VARCHAR(20),
城市 VARCHAR(20),
类别 VARCHAR(20)
)
INSERT INTO T VALUES ('张三','广东','广州','低客单');
INSERT INTO T VALUES ('李四','广东','广州','高客单');
INSERT INTO T VALUES ('王五','湖南','岳阳','高客单');
INSERT INTO T VALUES ('赵六','湖南','长沙','低客单');
INSERT INTO T VALUES ('钱七','广东','广州','高客单');
INSERT INTO T VALUES ('孙九','湖南','长沙','低客单');
select distinct a.省份,a.城市,isnull(c.cnt2,0) as 低客单数,isnull(b.cnt1,0) as 高客单数
from T a
left join (select 城市,count(*) as cnt1 from T where 类别 = '高客单' group by 城市) b
on a.城市 = b.城市
left join (select 城市,count(*) as cnt2 from T where 类别 = '低客单' group by 城市) c
on a.城市 = c.城市

Date:2020/12/22
Review index:❤❤❤
Topic:
表中的字段时user_id,time(用户访问时间)
在这里插入图片描述

求每个用户相邻两次浏览时间之差小于三分钟的次数
预计结果如下:
在这里插入图片描述
Solution:

IF OBJECT_ID('T','U') IS NOT NULL DROP TABLE T
CREATE TABLE T (
user_id INT,
times DATETIME
)
INSERT INTO T VALUES (1,'2020-12-7 21:13:07');
INSERT INTO T VALUES (1,'2020-12-7 21:15:26');
INSERT INTO T VALUES (1,'2020-12-7 21:17:44');
INSERT INTO T VALUES (2,'2020-12-13 21:14:06');
INSERT INTO T VALUES (2,'2020-12-13 21:18:19');
INSERT INTO T VALUES (2,'2020-12-13 21:20:36');
INSERT INTO T VALUES (3,'2020-12-21 21:16:51');
INSERT INTO T VALUES (4,'2020-12-16 22:22:08');
INSERT INTO T VALUES (4,'2020-12-2 21:17:22');
INSERT INTO T VALUES (4,'2020-12-30 15:15:44');
INSERT INTO T VALUES (4,'2020-12-30 15:17:57');

select a.user_id,isnull(count(b.subtract),0) as cnt
from  (select distinct user_id from T) a
left join (select * from(
         select *,
                (select cast(a.times - b.times as time)
                 from (select *
                            , row_number() over (order by user_id asc,times asc)      as ID
                            , row_number() over (partition by user_id order by times) as usertimeid
                       from T) b
                 where a.ID = B.ID + 1) as subtract
         from (select *
                    , row_number() over (order by user_id asc,times asc)      as ID
                    , row_number() over (partition by user_id order by times) as usertimeid
               from T) a ) a
    where usertimeid <> 1 and subtract < '00:03:00'
     ) b
on a.user_id = b.user_id
group by a.user_id

Date:2020/12/18
Review index:
Topic:
给定一个 Weather 表,编写一个 SQL 查询,来查找与之前(昨天的)日期相比温度更高的所有日期的 Id。
在这里插入图片描述

例如,根据上述给定的 Weather 表格,返回如下 Id:
在这里插入图片描述
Solution:

if object_id('T','U') IS NOT NULL DROP TABLE T
CREATE TABLE T (
ID INT,
REDATE DATE,
TEMP INT)
INSERT INTO T VALUES (1,'2020-1-1',10);
INSERT INTO T VALUES (2,'2020-1-2',18);
INSERT INTO T VALUES (3,'2020-1-3',15);
INSERT INTO T VALUES (4,'2020-1-4',20);
SELECT ID FROM T a WHERE EXISTS(SELECT * FROM T b WHERE b.ID = a.ID - 1 and a.TEMP > B.TEMP )

Date:2020/12/17
Review index:
Topic:
有如下一张合同表T
在这里插入图片描述
现在想获得每个直接合同的价格已经对应的补充合同的价格,得到的结果大致如下:
在这里插入图片描述
Solution:

if object_id( 'T','u')is not null drop table T
CREATE TABLE T
(
ID INT,
Type VARCHAR(20),
MasterID INT,
Amount INT
)
INSERT INTO T VALUES (1,'直接合同',NULL,5000);
INSERT INTO T VALUES (2,'补充合同',1,1000);
INSERT INTO T VALUES (3,'补充合同',1,500);
INSERT INTO T VALUES (4,'直接合同',NULL,6000);
INSERT INTO T VALUES (5,'直接合同',NULL,4000);
INSERT INTO T VALUES (6,'补充合同',5,1000);

select ID,Type,Amount,isnull(b.Amount2,0) as Amount2
from T a
left join (select distinct MasterID,sum(Amount) over(partition by MasterID) as Amount2 from T) b
on a.ID = B.MasterID
where Type = '直接合同'

Date:2020/12/16
Review index:❤❤
Topic:
有如下一张表T1:
在这里插入图片描述
T2:
在这里插入图片描述
两表之间无任何关联关系,且数据行数也不相同,希望将两表进行拼接成一张表。预计结果如下
在这里插入图片描述
Solution:

if object_id( 'T1','u')is not null drop table T1
CREATE TABLE T1
(
A INT,
B INT
)
INSERT INTO T1 VALUES (1,2);
INSERT INTO T1 VALUES (4,6);
if object_id( 'T2','u')is not null drop table T2
CREATE TABLE T2
(
C INT,
D INT,
E INT
)
INSERT INTO T2 VALUES(7,4,3);
INSERT INTO T2 VALUES(9,5,8);
INSERT INTO T2 VALUES(11,15,18);
select A,B,C,D,E
from (select *,row_number() over(order by A) as IDX1 from T1) a
right join (select *,row_number() over (order by C) as IDX2 from T2) b
ON IDX1 = IDX2

Date:2020/8/18
Review index:
Topic:
表 T 保存了一些点在 X 轴上的坐标,这些坐标都是整数。
在这里插入图片描述
写一个查询语句,找到这些点中最近两个点之间的距离。
最近距离显然是 ‘1’ ,是点 ‘-1’ 和 ‘0’ 之间的距离。所以输出应该如下:
在这里插入图片描述

注意:每个点都与其他点坐标不同,表 table 不会有重复坐标出现。
Solution:

if object_id( 'T','u')is not null drop table T
CREATE TABLE T(
    X INT
)
INSERT INTO T
VALUES
(-1),(0),(2)
SELECT top 1 (LENGTH) as shortest
FROM (
         SELECT X1, X2, ABS(X1) + ABS(X2) AS LENGTH
         FROM (
                  SELECT A.X AS X1, B.X AS X2
                  FROM T a
                           CROSS JOIN T b
              ) C
    where x1 <> x2
     )A
order by length asc

Date:2020/8/17
Review index:❤❤
Topic:
有如下一张表T
在这里插入图片描述

列AID和BID是一对多的关系,希望将BID中同时存在3和5的AID找出来,预计的结果如下:
在这里插入图片描述
Solution:

IF OBJECT_ID('T','U')IS NOT NULL DROP TABLE T
CREATE TABLE T
(
    AID INT,
    BID INT
)
INSERT INTO T
VALUES
(1,2),
(1,5),
(2,1),
(2,2),
(2,3),
(2,4),
(2,5)
SELECT AID FROM (
                    SELECT DISTINCT AID
                                  , SUM(BID1) OVER ( PARTITION BY AID ) AS COUNT1
                                  , SUM(BID2) OVER (PARTITION BY AID )  AS COUNT2
                    FROM (
                             SELECT AID
                                  , BID
                                  , CASE WHEN BID = 3 THEN 1 ELSE 0 END AS BID1
                                  , CASE WHEN BID = 5 THEN 1 ELSE 0 END AS BID2
                             FROM T) A
                )B
WHERE COUNT1 + COUNT2 > 

Date:2020/8/14
Review index:❤❤
Topic:
有如下一张表T
在这里插入图片描述

查询出每个发货单号(shipid),最早付款时间(paydate)和最小付款单号(payno)
结果如下:
在这里插入图片描述
Solution:

IF OBJECT_ID('T','U')IS NOT NULL DROP TABLE T
CREATE TABLE T (
    SHIPID VARCHAR(10),
    PAYDATE DATE,
    PAYNO INT
)
INSERT INTO T
VALUES
       ('1001','2019-11-2',5),
       ('1001','2019-11-2',3),
       ('1001','2019-11-3',1),
       ('1001','2019-11-3',3),
       ('1002','2019-11-9',1),
       ('1002','2019-11-9',4),
       ('1002','2019-11-8',3),
       ('1002','2019-11-8',2)
SELECT DISTINCT SHIPID,PAYDATE,MIN(PAYNO) OVER(PARTITION BY PAYDATE) AS PAYNO FROM(
    SELECT DISTINCT SHIPID,PAYDATE,MIN(PAYDATE) OVER(PARTITION BY SHIPID) AS MINPAYDATE,PAYNO
FROM T) A
WHERE PAYDATE = MINPAYDATE

Date:2020/8/13
Review index:❤❤❤
Topic:
有如下一张表T
在这里插入图片描述

想要得到如下结果:
在这里插入图片描述

解释:T表中的Result列的第1行始终保持为1,后面的数据行=上一行的结果+上一行的NUM值,例如ID为2的Result为6=1+5,ID为3的Result为9=6+3,以此类推。
该如何写这个SQL?
Solution:

IF OBJECT_ID('T','U')IS NOT NULL DROP TABLE T
CREATE TABLE T (
   ID INT IDENTITY(1,1),
   NUM INT
)
INSERT INTO T (NUM)
VALUES
(5),
(3),
(12),
(2),
(7),
(9)
ALTER  procedure dbo.cumulative
@TABLE VARCHAR(MAX)
as
    begin
        exec('alter table '+ @table+' add result int')
        exec('update '+ @table+' set result = 1 where id = 1')
        declare @i int
        set @i = 2
        while @i < 7
            BEGIN
        exec('update a set result = b.NUM + b.result
        from '+@table+' a
        left join '+@table+' b
        on a.id = b.id + 1
        where a.id = '+@i)
        set @i = @i+1
                END
    end
dbo.cumulative 'T'
select * from T

Date:2020/8/12
Review index:
Topic:
编写一个SQL查询,用于选择每种销售产品的第一年的产品ID、年份、数量和价格。表格如下所示:T
在这里插入图片描述
返回如下结果
Result table:
在这里插入图片描述
Solution:

----方法1
IF OBJECT_ID('T','U')IS NOT NULL DROP TABLE T
CREATE TABLE T (
    SALE_ID INT,
    PRODUCT_ID INT,
    YEAR DATE,
    QUANTITY INT,
    PRICE INT
)
INSERT INTO T
VALUES
       (1,100,'2008',10,5000),
       (2,100,'2009',12,5000),
       (7,200,'2011',15,9000),
       (9,300,'2009',14,6000),
       (11,300,'2011',18,6500)
SELECT A.PRODUCT_ID,YEAR(A.FISTYEAR),QUANTITY,PRICE
FROM (
         SELECT DISTINCT PRODUCT_ID, MIN(YEAR) OVER (PARTITION BY PRODUCT_ID)  AS FISTYEAR
FROM T)A
LEFT JOIN T B
ON A.PRODUCT_ID = B.PRODUCT_ID AND A.FISTYEAR = B.YEAR

----方法2
select product_id,year(year) as firstyear,quantity,price from (
select *,row_number() over (partition by product_id order by year ) as rnk from T
    ) a
where a.rnk = 1

Date:2020/8/11
Review index:
Topic:
有如下一张表T,
在这里插入图片描述

想要得到如下结果
在这里插入图片描述

该如何写这个SQL?
Solution:

IF OBJECT_ID('T','U')IS NOT NULL DROP TABLE T
CREATE TABLE  T (
    姓名 varchar(10),
    今日金额 int,
    本周金额 int,
    本月金额 int,
    分组 int
)
insert into T
VALUES
('张三',100,900,2700,1),
('李四',120,680,2900,1),
('王五',110,850,3000,2),
('马六',120,790,2800,2)
select 姓名,今日金额,本周金额,本月金额 from T where 分组 = 1
UNION ALL
SELECT '组1' as 姓名,sum(今日金额) as 今日金额,sum(本周金额) as 本周金额,sum(本月金额) as 本月金额
from T
where 分组 = 1
GROUP BY 分组
union all
select 姓名,今日金额,本周金额,本月金额 from T where 分组 = 2
union all
select '组2' as 姓名,sum(今日金额) as 今日金额,sum(本周金额) as 本周金额,sum(本月金额) as 本月金额
from T
where 分组 = 2
group by 分组
union all
select '总计' as 姓名,sum(今日金额) as 今日金额,sum(本周金额) as 本周金额,sum(本月金额) as 本月金额
from T


Date:2020/8/10
Topic:参照2020/7/14的题
Review index:❤❤
有如下一张表T,其中ID是自增长
在这里插入图片描述

求解,如何将相邻两条记录的Name进行位置交换?预期结果如下:
在这里插入图片描述

其中,最后一条记录如果是奇数则不交换。
考点:case when的灵活运用
Solution:

if object_id('T','U')is not null drop table T
create table T (
    ID INT IDENTITY(1,1),
    Name varchar(10)
)
insert into T(Name)
values
('张三'),
('李四'),
('王五'),
('马六'),
('赵七')
select a.ID
     ,CASE WHEN a.ID%2=0 AND A.ID !=1 THEN c.NAME
         when a.ID%2 = 1 AND a.ID = MAXID THEN a.NAME
         else b.name END AS NAME
FROM (select id,name,max(id) OVER( ) AS MAXID from T group by id,NAME )a
left join  T b
on a.ID = b.ID -1
left join T C
ON a.ID = C.ID + 1

Date:2020/8/7
Topic:
有如下一组数据
在这里插入图片描述

希望能够将地址中的数字替换成*,来保护数据。预期的结果应该为
在这里插入图片描述
Solution:





Date:2020/8/4
Topic:
Review index:❤❤❤
declare @a varchar(500)
declare @b varchar(500)

set @a=‘123,412,532’
set @b=‘bcs,ddd’
希望通过轮询,实现如下table中的结果 (table有两个字段 a和b)
在这里插入图片描述

即@a和@b里面的参数通过逗号(,)分割后,循环的两两组合。
Solution:

declare @a  varchar(500)
declare @b  varchar(500)
set @a='123,412,532'
set @b='bcs,ddd'
IF OBJECT_ID('A','U')IS NOT NULL DROP TABLE A
select @a as a into A
IF OBJECT_ID('B','U')IS NOT NULL DROP TABLE B
select @b as B into B
declare @x xml
SET @x=(select a = cast('<v>'+replace(a,',','</v><v>')+'</v>' AS xml )
 from A)
select a=T.c.value('.','varchar(20)')
into A_new
from @x.nodes('v') T(c)
declare @x1 xml
SET @x1=(select b = cast('<v>'+replace(b,',','</v><v>')+'</v>' AS xml )
 from B)
select b=T.c.value('.','varchar(20)')
into B_new
from @x1.nodes('v') T(c)
select * from a_new cross join b_new

Date:2020/8/3
Topic:
Review index:❤❤❤❤
表A如下所示
在这里插入图片描述

查询出最大连续不合格期数大于3的记录。
预计结果如下:
在这里插入图片描述
Solution:

IF OBJECT_ID('A','U')IS NOT NULL DROP TABLE A
CREATE TABLE A
(
ID INT ,
QISHU INT,
CHENGJI VARCHAR(10)
)
INSERT INTO A
VALUES
(1,34,'不合格'),
(2,35,'合格'),
(3,36,'合格'),
(4,37,'不合格'),
(5,38,'不合格'),
(6,39,'不合格'),
(7,40,'不合格'),
(8,41,'合格'),
(11,42,'合格')
ALTER TABLE A ADD IDX INT IDENTITY(1,1)
select* from(
SELECT distinct A2.id,A2.qishu,A2.chengji FROM A A1, A A2 , A A3
WHERE (A1.IDX=A2.IDX+1 AND A1.CHENGJI=A2.CHENGJI )
   or
      ( A2.IDX=A3.IDX+1 and A2.CHENGJI=A3.CHENGJI)
    )a
where chengji = '不合格'

Date:2020/7/31
Topic:
Review index:
有如下两张表A,表B
表A:
在这里插入图片描述

表B:
在这里插入图片描述

希望得到如下结果:
在这里插入图片描述

anum表示每个人参加的项目数,bnum表示每个人在各自项目中胜利的次数该如何写这个查询?
Solution:

if object_id('A','U')is not null drop table A
CREATE TABLE A(
    aid varchar(10),
    bid varchar(10)
)
insert into A
VALUES
('跑步','张三'),
('游泳','张三'),
('跳远','李四'),
('跳高','王五')
if object_id('B','U')is not null drop table B
CREATE TABLE B(
aid varchar(10),
bid varchar(10),
cid varchar(10)
)
insert into B
VALUES
('跑步','张三','胜'),
('游泳','张三','胜'),
('跳高','王五','胜')
SELECT * FROM A
SELECT * FROM B
select c.BID,c.anum,isnull(d.bnum,0)
from (
         SELECT BID, COUNT(AID) as anum
         FROM A
         GROUP BY BID
     ) c
left join
    (select BID,count(*) as bnum from B group by bid) d
on c.bid = d.bid



Date:2020/7/29
Topic:
How easy is it:
表T 定义如下:order_id(订单编号),customer_id(客户编号),order_date(下单日期)
在这里插入图片描述

在表 orders 中找到订单数最多客户对应的 customer_id 。预计的输出结果:
在这里插入图片描述
Solution:

if object_id('T','U')is not null drop table T
create table T(
    order_id int identity(1,1),
    customer_id int,
    orderdate varchar(20)
)
insert into T(customer_id,orderdate)
values
(1,'20190624'),
(2,'20190423'),
(3,'20190321'),
(3,'20190429'),
(4,'20190812'),
(4,'20190914')
select * from T
select customer_id from (
                            select *, rank() over (order by count desc) as rnk
                            from (
                                     SELECT CUSTOMER_ID, COUNT(ORDER_ID) as count
                                     FROM T
                                     GROUP BY CUSTOMER_ID) a
                        )a
where rnk = 1

Date:2020/7/28
Topic:
Review index:❤❤
给定一个表 T,id 是树节点的编号, p_id 是它父节点的 id 。
在这里插入图片描述

树中每个节点属于以下三种类型之一:叶子:如果这个节点没有任何孩子节点。根:如果这个节点是整棵树的根,即没有父节点。内部节点:如果这个节点既不是叶子节点也不是根节点。
写一个查询语句,输出所有节点的编号和节点的类型,并将结果按照节点编号排序。上面样例的结果为:
在这里插入图片描述

节点 ‘1’ 是根节点,因为它的父节点是 NULL ,同时它有孩子节点 ‘2’ 和 ‘3’ 。节点 ‘2’ 是内部节点,因为它有父节点 ‘1’ ,也有孩子节点 ‘4’ 和 ‘5’ 。节点 ‘3’, ‘4’ 和 ‘5’ 都是叶子节点,因为它们都有父节点同时没有孩子节点。注意
如果树中只有一个节点,你只需要输出它的根属性。
Solution:

----方法1:
IF OBJECT_ID('T','U')IS NOT NULL DROP TABLE T
CREATE TABLE T(
    ID INT IDENTITY(1,1),
    PID VARCHAR(10)
)
INSERT INTO T(PID)
VALUES
(NULL),
(1),
(1),
(2),
(2)
SELECT ID,CASE WHEN PID IS NULL THEN 'Root'
when id in (select pid from t) and PID is not null then 'Inner'
else 'Leaf' end as type
from T

Date:2020/7/27
Topic:
Review index:
写一条 SQL 查询语句,从 T表中查询购买了 P表中所有产品的客户的 id。示例:T 表:
在这里插入图片描述

P 表:
在这里插入图片描述

Result 表:
在这里插入图片描述
Solution:

IF OBJECT_ID('T','U')IS NOT NULL DROP TABLE T
CREATE TABLE T(
    CUSTOMER_ID INT,
    PRODUCT_KEY INT
)
INSERT INTO T
VALUES
(1,5),
(2,6),
(3,5),
(3,6),
(1,6)
IF OBJECT_ID('P','U')IS NOT NULL DROP TABLE P
CREATE TABLE P(
    PRODUCT_KEY INT
)
INSERT INTO P
VALUES
(5),(6)
select distinct customer_id from (
                            select customer_id, count(product_key) over (partition by customer_id) as count
                            from t
                            group by customer_id, product_key
                        )a
where count = (select count(*) from p)

Date:2020/7/24
Topic:
Review index:
有如下两张表
T 表:
在这里插入图片描述

P 表:
在这里插入图片描述

编写一个SQL查询,要求去年销售少于10本的书籍,不包括从今天起1个月内可供使用的书籍。假设今天是2019-06-23。结果表:
在这里插入图片描述
Solution:






Date:2020/7/22
Topic:
Review index:
有一张表T
在这里插入图片描述

根据分数从高到低返回如下结果
在这里插入图片描述
注意:分数相同的名次相同,下一个名次应该是连续整数值。换句话说,名次间不应该有“间隔”
Solution:

IF OBJECT_ID('T','U')IS NOT NULL DROP TABLE T
CREATE TABLE T(
    ID INT IDENTITY(1,1),
    Score int
)
insert into T(Score)
values
(80),(75),(89),(80),(71)
select Score,dense_rank() over (order by score desc) from t

Date:2020/7/20
Topic:
Review index:
有一张表T:
在这里插入图片描述
返回如下结果,希望得到每种产品第一年所对应的价格和销量。
在这里插入图片描述
Solution:

IF OBJECT_ID('T','U')IS NOT NULL DROP TABLE T
CREATE TABLE T (
    sale_id int,
    product_id int,
    year varchar(10),
    quantity int,
    price int
)
insert into T
VALUES
(1,100,'2008',10,5000),
(2,100,'2009',12,5000),
(7,200,'2011',15,9000),
(9,300,'2009',14,6000),
(11,300,'2011',18,6500)
select product_id,year,quantity,price
from(
select *,ROW_NUMBER() over(partition by product_id order by year asc) as rnk
from T
) as a
where rnk = 1


Date:2020/7/17
Topic:
Review index:❤❤❤
Employee 表包含所有员工。Employee 表有三列:员工Id,公司名和薪水。
在这里插入图片描述
请编写SQL查询来查找每个公司的薪水中位数。挑战点:你是否可以在不使用任何内置的SQL函数的情况下解决此问题。
在这里插入图片描述
按 company 分组排序,记为 rk
计算各 company 的记录数除以2,记为 cnt
连接结果
找出符合中位数要求的记录

有 2 个要点:分组排序通过两个变量完成,注意 @com 的更新顺序要在 @rk 之后
按示例,若记录数为奇数,取一条,否则取两条,如记录数为7,则第4名是中位数,
记录数为6,则第3,4名是中位数。由于 cnt = 计数除以2,则对应序号可直接用 in (cnt+0.5,cnt+1,cnt) 来表达
Solution:

IF OBJECT_ID('T')IS NOT NULL DROP TABLE T
CREATE TABLE T(
Id int identity(1,1),
Company varchar(30),
Salary int
)
insert into T(Company,Salary)
values
('A',2341),
('A',341),
('A',15),
('A',15314),
('A',451),
('A',513),
('B',15),
('B',13),
('B',1154),
('B',1345),
('B',1221),
('B',234),
('C',2345),
('C',2645),
('C',2645),
('C',2652),
('C',65)
select id,company,salary
from (
         select id
              , company
              , Salary
              , row_number() over (partition by company order by Salary asc) as rnk
              , count(salary) over (partition by company )                   as countc
         from T
         group by id, company, salary
     ) a
where (countc%2 = 1 and rnk = (countc+1)/2) or (countc%2 = 0 and (rnk = countc/2 or rnk = countc/2+1))


Date:2020/7/16
Topic:
Review index:❤❤❤❤
表T的查询结果:
在这里插入图片描述
当001值是‘否’且002子项为空时均不显示记录;当001值是‘是’且002子项有记录时均不显示记录;当001值是‘是’且002子项为空时显示002行空记录;当001值是‘空’且002子项为空时都显示记录;最终理想的查询结果:
在这里插入图片描述
Solution:

if object_id('T','U')is not null drop table T
CREATE TABLE T(
    ID INT,
    CODE VARCHAR(30),
    QUESTION VARCHAR(30),
    VALUE VARCHAR(30)
)
insert into T
VALUES
(1,'001','是否吸烟','否'),
(1,'002','吸烟年龄',null),
(2,'001','是否吸烟','是'),
(2,'002','吸烟年龄','18'),
(3,'001','是否吸烟','是'),
(3,'002','吸烟年龄',null),
(4,'001','是否吸烟',null),
(4,'002','吸烟年龄',null)
ALTER TABLE T ADD IDX INT IDENTITY(1,1),VALUE1 VARCHAR(30)
UPDATE T SET VALUE1 = VALUE
UPDATE T1 SET T1.VALUE1 = T2.VALUE1
from T T1
left join T T2
on (T1.IDX%2 = 0 and T1.IDX = (T2.IDX + 1)) or (T1.IDX%2 = 1 and T1.IDX = (T2.IDX - 1))
selECT ID,CODE,QUESTION,VALUE FROM T
where (value is null and value1 = '是') or (value is null and value1 is null)

Date:2020/7/15
Topic:
给如下两个表,写一个查询语句,求出在每一个工资发放日,每个部门的平均工资与公司的平均工资的比较结果 (高 / 低 / 相同)。表:salary
在这里插入图片描述
employee_id 字段是表 employee 中 employee_id 字段的外键。
在这里插入图片描述
对于如上样例数据,结果为:
在这里插入图片描述
解释
在三月,公司的平均工资是 (9000+6000+10000)/3 = 8333.33…
由于部门 ‘1’ 里只有一个 employee_id 为 ‘1’ 的员工,所以部门 ‘1’ 的平均工资就是此人的工资 9000 。因为 9000 > 8333.33 ,所以比较结果是 ‘higher’。第二个部门的平均工资为 employee_id 为 ‘2’ 和 ‘3’ 两个人的平均工资,为 (6000+10000)/2=8000 。因为 8000 < 8333.33 ,所以比较结果是 ‘lower’ 。在二月用同样的公式求平均工资并比较,比较结果为 ‘same’ ,因为部门 ‘1’ 和部门 ‘2’ 的平均工资与公司的平均工资相同,都是 7000 。

Solution:




Date:2020/7/14
Topic:
有如下两张表: Candidate(候选人)
在这里插入图片描述
表: Vote(选票)
在这里插入图片描述
id 是自动递增的主键,
CandidateId 是 Candidate 表中的 id.
请编写 sql 语句来找到当选者的名字,即选票最多的候选者。上面的例子将返回当选者 B,因为他获得了2票,其他人获得了1票或0票。
在这里插入图片描述
注意:
你可以假设没有平局,换言之,最多只有一位当选者。
Solution:

IF OBJECT_ID('Candidate','U')IS NOT NULL DROP TABLE Candidate
CREATE TABLE Candidate(
ID INT identity(1,1),
Name varchar(30)
)
insert into Candidate (Name)
VALUES
('A'),
('B'),
('C'),
('D'),
('E')
IF OBJECT_ID('Vote','U')IS NOT NULL DROP TABLE Vote
CREATE TABLE Vote(
ID INT identity(1,1),
CandidateId INT
)
insert into Vote (CandidateId)
VALUES
(2),
(4),
(3),
(2),
(5)
SELECT NAME FROM(
 select NAME,row_number() over(order by countv desc) as rnk 
 from(
  SELECT NAME,COUNT(*) AS Countv FROM 
  (
   SELECT a.ID,a.CandidateId,b.Name 
   from  Vote a
   left join Candidate b
   on a.CandidateId = b.ID
  )A
  GROUP BY NAME
 )B
)C
where rnk = 1

Date:2020/7/13
Review index:❤❤❤❤❤
Topic:
有如下一张表Person,其中ID是自增长
在这里插入图片描述
求解,如何将相邻两条记录的Name进行位置交换?预期结果如下:
在这里插入图片描述
其中,最后一条记录如果是奇数则不交换。
Solution:

IF OBJECT_ID('Person','u')IS NOT NULL DROP TABLE Person
CREATE TABLE Person
(
ID INT IDENTITY(1,1),
Name varchar(30)
)
insert into Person (Name)
VALUES
('张三'),
('李四'),
('王五'),
('马六'),
('赵七')
update p1 set p1.name = p2.name
from Person p1
left join Person p2
on (p1.id%2 = 0 and p1.id = (p2.id + 1)) or (p1.id%2 = 1 and p1.id = (p2.id - 1))
where p2.name is not null;
select * from Person 

Date:2020/7/10
Topic:
有如下一张表T
在这里插入图片描述
要求得出如下结果:
在这里插入图片描述
依次得出最新单价,上一次单价,上上次单价,如果不存在则用0替代。
Solution:

IF OBJECT_ID('T','U')IS NOT NULL DROP TABLE T
CREATE TABLE T (
物品 varchar(30),
购买日期 date,
单价 int,
)
INSERT INTO T
VALUES
('A','2018-11-1',100),
('A','2018-10-1',120),
('A','2018-12-1',115),
('B','2018-11-1',99),
('B','2018-9-1',88)
SELECT * ,ROW_NUMBER() OVER(PARTITION BY 物品 order by 购买日期 desc) AS RNK
INTO TEMP
FROM T
SELECT distinct a.物品,isnull(B.单价,0) AS 最新单价,isnull(C.单价,0) AS 上一次单价,isnull(D.单价,0) AS 上上次单价 
FROM temp a
left join temp b
on a.物品 = b.物品 AND b.RNK = 1
left join temp C
on a.物品 = c.物品 AND c.RNK = 2
left join temp d
on a.物品 = d.物品 AND d.RNK = 3
-----另一种方法(用Pivot转置)
SELECT distinct 物品,isnull([1],0) AS 最新单价,isnull([2],0) AS 上一次单价,isnull([3],0) AS 上上次单价 
FROM 
(select 物品,单价,RNK FROM TEMP)A
PIVOT
(max(单价) for rnk in ([1],[2],[3]))b

Date:2020/7/9
Topic:
有如下一张表T
在这里插入图片描述
现在需要查询TripsID相同情况下,SetTime获取到一个月以后的最小最大数据。查询结果如下:
在这里插入图片描述
Solution:

----看第一遍题目的时候没有能够理解,其实就是settime那一列每个日期加一个月
IF OBJECT_ID('T','U') IS NOT NULL DROP TABLE T
CREATE TABLE T(
ID INT  IDENTITY(1,1),
SetTime date,
TripsID INT
)
INSERT INTO T(SetTime,TripsID )
VALUES
('2019-1-1',1),
('2019-2-1',1),
('2019-3-1',1),
('2019-4-1',2),
('2019-5-1',2),
('2019-6-1',2),
('2019-7-1',2),
('2019-8-1',3),
('2019-9-1',3),
('2019-10-1',3),
('2019-11-1',3)
SELECT distinct TripsID,min(SetTimeAD) over(partition by TripsID) as SetTime1
,max(SetTimeAD) over(partition by TripsID) as SetTime2
 from(
SELECT TripsID,SetTime,DATEADD(month, 1, SetTime) as SetTimeAD FROM T) a
group by TripsID,SetTimeAD

Date:2020/7/8
Topic:
有如下一张表T
在这里插入图片描述
其中A列的类型为INT,B列的类型为VARCHAR(20)
要求查询出所有A不在B里的行(即B不包含A)
得到的结果如下:
在这里插入图片描述
Solution:

IF OBJECT_ID('T','U')IS NOT NULL DROP TABLE T
CREATE TABLE T(
A INT,
B VARCHAR(20)
)
INSERT INTO T
VALUES
(1,'1'),
(1,'1,2'),
(1,'1,2,3'),
(2,'1,2'),
(2,'1,2,3'),
(2,'2,3'),
(2,'3'),
(3,'1,2,3'),
(3,NULL),
(3,'1,2')
IF OBJECT_ID('T','U')IS NOT NULL DROP TABLE T
CREATE TABLE T(
A INT,
B VARCHAR(20)
)
INSERT INTO T
VALUES
(1,'1'),
(1,'1,2'),
(1,'1,2,3'),
(2,'1,2'),
(2,'1,2,3'),
(2,'2,3'),
(2,'3'),
(3,'1,2,3'),
(3,NULL),
(3,'1,2')
ALTER TABLE T ADD idx INT identity(1,1)
UPDATE T SET ROWNUM = (SELECT ROW_NUMBER() OVER(ORDER BY A) )
SELECT A,B FROM T WHERE IDX NOT IN(
SELECT s.IDX FROM(
   select idx ,count(*) as count from (
     SELECT idx,C.A, D.B FROM
     (
       SELECT idx,A, B = CONVERT(xml,'<root><v>' + REPLACE(B, ',', '</v><v>') + '</v></root>') FROM t
     ) C 
     OUTER APPLY
     (
       SELECT B = N.v.value('.', 'varchar(100)') FROM C.B.nodes('/root/v') N(v)
     ) D
     where C.A = D.B) a
   group by idx
)s    
)

Date:2020/7/7
Topic:
有如下一张表
T:
在这里插入图片描述
获取player首次登录设备的device_id,返回的结果如下:
在这里插入图片描述
Solution:

IF OBJECT_ID('T','U') IS NOT NULL DROP TABLE T
CREATE TABLE T (
player_id int,
device_id int,
event_date date,
games_played int
)
insert into T
values
(1,2,'2016-03-01',5),
(1,2,'2016-05-02',6),
(2,3,'2017-06-25',1),
(3,1,'2016-03-02',0),
(3,4,'2018-07-03',5)
select player_id,device_id from(
select player_id,device_id,event_date,min(event_date) over(partition by player_id) as mindate,games_played
from t
group by player_id,device_id,event_date,games_played) a
where event_date = mindate

Date:2020/7/6
Topic:
有如下两张表
Project表:
在这里插入图片描述
Employee表:
在这里插入图片描述
查询出每个项目中经验最丰富(experience_years最大)的员工,返回的结果如下:
在这里插入图片描述
说明:员工1和3是project_id为1中exprerience_years最丰富的,
而project_id为2的项目,员工id为1的是exprerience_years最丰富
Solution:

IF OBJECT_ID('Project','U')IS NOT NULL DROP TABLE Project
CREATE TABLE Project(
Project_id int,
employee_id int
)
insert into Project
values
(1,1),
(1,2),
(1,3),
(2,1),
(2,4)
IF OBJECT_ID('Staff','U')IS NOT NULL DROP TABLE Staff
create table Staff(
employee_id int,
name varchar(30),
experience_years int
)
INSERT INTO Staff 
VALUES
(1,'Khaled',3),
(2,'Ali',2),
(3,'John',3),
(4,'Doe',2)
select project_id,employee_id from (
select Project_id,employee_id,name,experience_years,max(experience_years) over(partition by Project_id) as maxexperience
from(
select a.Project_id,a.employee_id,b.name,b.experience_years 
from Project a
left join Staff b
on a.employee_id = b.employee_id) a
group by Project_id,employee_id,name,experience_years,experience_years
) a
where experience_years = maxexperience


Date:2020/7/3
Topic:
有一张表T
在这里插入图片描述
最终统计的结果希望是name 对于pid来说不重复的总数,就是过滤后等于
在这里插入图片描述
然后统计出
在这里插入图片描述
该如何写这个SQL
Solution:

IF OBJECT_ID('T','U')IS NOT NULL DROP TABLE T
CREATE TABLE T(
id INT,
name VARCHAR(30),
pid int
)
insert into T
VALUES
(1,'a',1),
(2,'a',1),
(3,'b',1),
(4,'b',1),
(5,'a',2),
(6,'b',2),
(7,'c',2)
select name,count(pid) 
from(
select DISTINCT name,pid from t
) a
group by name

Date:2020/6/29
Topic:
表 T定义如下:order_id(订单编号),customer_id(客户编号),order_date(下单日期)
有如下几条记录:
在这里插入图片描述
在表 orders 中找到订单数最多客户对应的 customer_id 。预计的输出结果:
在这里插入图片描述
Solution:

IF OBJECT_ID('T','U')IS NOT NULL DROP TABLE T
CREATE TABLE T(
order_id INT,
customer_id INT,
order_date VARCHAR(30)
)
INSERT INTO T
VALUES
(1,1,'20190624'),
(2,2,'20190423'),
(3,3,'20190321'),
(4,3,'20190429'),
(5,4,'20190812'),
(6,4,'20190914')
select b.customer_id from (
select *,rank() over(order by a.count1 desc) as ranking from (select customer_id,count(*) as count1 from t group by customer_id) a) b
where b.ranking=1

Date:2020/6/28
Topic:
有如下一张表T
在这里插入图片描述
查询出每个发货单号(shipid),最早付款时间(paydate)和最小付款单号(payno)
结果如下:
在这里插入图片描述
Solution:

IF OBJECT_ID('T','U')IS NOT NULL DROP TABLE T
CREATE TABLE T (
shipid varchar(30),
paydate date,
payno int
)
insert into T
VALUES
('1001','2019/11/2',5),
('1001','2019/11/2',3),
('1001','2019/11/3',1),
('1001','2019/11/3',3),
('1002','2019/11/9',1),
('1002','2019/11/9',4),
('1002','2019/11/8',3),
('1002','2019/11/8',2)
select a.shipid,a.paydate,b.payno from
(SELECT  SHIPID,MIN(PAYDATE) AS PAYDATE
FROM T GROUP BY SHIPID) a 
LEFT JOIN 
(SELECT distinct SHIPID,PAYDATE,MIN(PAYNO) OVER(PARTITION BY PAYDATE) as payno FROM T ) b
on a.shipid= b.shipid and a.paydate=b.paydate

Date:2020/6/24
Topic:
用一条SQL 语句 查询出每门课都大于80 分的学生姓名,表格样式及数据如下:
在这里插入图片描述
结果为:
在这里插入图片描述
Solution:

IF OBJECT_ID('T','U') IS NOT NULL DROP TABLE T
CREATE TABLE T(
NAME VARCHAR(30),
COURSE VARCHAR(30),
SCORE INT
)
INSERT INTO T
VALUES
('张三','语文',81),
('张三','数学',75),
('李四','语文',76),
('李四','数学',90),
('王五','语文',81),
('王五','数学',100),
('王五','英语',90)
select name from(
select a.name,a.count1,b.count2 from
(SELECT NAME,COUNT(COURSE) as count1 FROM T  GROUP BY NAME) a
LEFT JOIN 
(SELECT NAME,COUNT(COURSE) as count2 FROM T  where score>80 GROUP BY NAME) b
on a.name =b.name
where count1 = count2) c

Date:2020/6/23
Topic:
编写一个 SQL 查询,获取Employee 表中第二高的薪水(Salary) 。
在这里插入图片描述
例如上述 Employee 表,SQL查询应该返回 200 作为第二高的薪水。如果不存在第二高的薪水,那么查询应返回 null。
结果如下:
在这里插入图片描述
Solution:

IF OBJECT_ID('T','U')IS NOT NULL DROP TABLE T
CREATE TABLE T(
ID INT,
Salary INT
)
INSERT INTO T
VALUES
(1,100),
(2,200),
(3,300)
SELECT ISNULL(MAX(SALARY),NULL) AS SecondHighestSalary FROM T 
WHERE SALARY NOT IN(SELECT  MAX(SALARY) FROM T) 

Date:2020/6/22
Topic:
编写一个 SQL 查询,查找所有至少连续出现两次的数字。
在这里插入图片描述
例如,给定上面的T表, 1 和2是连续出现至少两次的数字。
在这里插入图片描述
Solution:

IF OBJECT_ID('T','U')IS NOT NULL DROP TABLE T
CREATE TABLE T(
ID INT,
Num INT
)
INSERT INTO T
VALUES
(1,1),
(2,1),
(3,1),
(4,2),
(5,1),
(6,2),
(7,2)
select distinct T1.Num as Num,COUNT(*)+1
from 
T T1, 
T T2
where T1.Id = T2.Id-1
and T1.Num=T2.Num
group by T1.NUM


Date:2020/6/18
Topic:
有如下一张表T:
在这里插入图片描述
希望得到如下结果
在这里插入图片描述
Solution:

IF OBJECT_ID('T','U')IS NOT NULL DROP TABLE T
CREATE TABLE T(
ID INT,
Cname VARCHAR(30),
ParentID INT,
OrgID INT,
Type int
)
INSERT INTO T
VALUES
(1,'公司',0,0,1),
(2,'人事部',1,1,2),
(3,'张三',2,1,3),
(4,'财务部',1,1,2),
(4,'李四',4,1,3)


Date:2020/6/18
Topic:
有一张表T1
在这里插入图片描述
表T2
在这里插入图片描述
希望得到如下结果:
在这里插入图片描述
Solution:

IF OBJECT_ID('T1','U')IS NOT NULL DROP TABLE T1
CREATE TABLE T1(
UID VARCHAR(30),
UAddress VARCHAR(100),
Sales int
)
insert into T1
values
('001','花开村1号',10),
('002','花开村2号',15),
('003','花开村6号',15),
('004','水边村5号',16),
('005','水边村12号',8)

IF OBJECT_ID('T2','U')IS NOT NULL DROP TABLE T2
CREATE TABLE T2(
WORDERID VARCHAR(10),
UID VARCHAR(10)
)
INSERT INTO T2
VALUES
('90002','001,002,004'),
('90003','005')

--知识点:用逗号隔开的一行转成多行
select WORDERID
,c.value('.','varchar(50)') as UID 
into T3 from T2 
cross apply(select  cast('<row>'+replace(UID,',','</row><row>')+'</row>' as xml) as xmlcode) C1
cross apply xmlcode.nodes('*') t(c)

SELECT *,WORDERID FROM T1 LEFT JOIN T3 ON T1.UID = T3.UID



Date:2020/6/10
Topic:
有如下一张表T

IDUnamePriceBuydate
1张三14002020/4/1
2张三23002020/5/11
3李四45002020/2/12
4李四8802020/6/1
5王五7102020/3/20
6王五11002020/4/15
7王五46802020/6/10

要求得到的结果:取所有记录中Uname对应的Price最大的整行记录





Date:2020/6/10
Topic:
有如下三种表及表结构:TA(stuID,classID,stuName),分别对应学生编号,班级编号,学生姓名

stuIDclassIDstuName
1A张三
2A李四
3B王五

TB(classID,className),分别对应班级编号,班级名称

classIDclassName
A一班
B二班

TC(stuID,course,score),分别对应学生编号,课程名称,考试成绩

stuIDcoursescore
1语文80
1数学90
1英语70
2语文75
2数学68
2英语89
3语文91
3数学88
3英语79

查询一班各科成绩最高的学生姓名?

Solution:

IF OBJECT_ID('TA','U')IS NOT NULL DROP TABLE TA
IF OBJECT_ID('TB','U')IS NOT NULL DROP TABLE TB
IF OBJECT_ID('TC','U')IS NOT NULL DROP TABLE TC
CREATE TABLE TA(
stuID INT,
classID VARCHAR(30),
stuName VARCHAR(30)
)
CREATE TABLE TB(
classID VARCHAR(30),
className VARCHAR(30)
)
CREATE TABLE TC(
stuID  INT,
course  VARCHAR(30),
score INT
)
INSERT INTO TA
VALUES
(1,'A' , '张三'),
(2, 'A','李四'),
(3,'B' ,'王五')
INSERT INTO TB
VALUES
('A' , '一班'),
('B' , '二班')
INSERT INTO TC
VALUES 
(1 ,'语文',80),
(1 ,'数学',90),
(1 ,'英语',70),
(2 ,'语文',75),
(2 ,'数学',68),
(2 ,'英语',89),
(3 ,'语文',91),
(3,' 数学',88),
(3,' 英语',79)
select e.course,f.stuName from
(SELECT DISTINCT d.course,MAX(d.score) over (partition by d.course) as maxscore FROM 
(SELECT  c.stuID,c.course,c.score,a.stuName,a.classID,b.className
from TC c 
LEFT JOIN TA a
ON c.stuID=a.stuID
LEFT JOIN TB b
ON a.classID=b.classID 
WHERE className='一班') d) e
LEFT JOIN 
(SELECT  c.stuID,c.course,c.score,a.stuName
from TC c 
LEFT JOIN TA a
ON c.stuID=a.stuID
)f
on e.maxscore=f.score

Date:2020/6/9
Topic:
从一张考勤表T中找出员工每天的上班、下班打卡的具体时间
考勤表中相关字段如下:

IDNAMENOTIME
1张三10012020-6-9 08:45:28
2李四10022020-6-9 08:22:28
3张三10012020-6-9 12:13:04
4李四10022020-6-9 17:31:08
5王五10032020-6-9 9:06:18
6张三10012020-6-9 18:05:13

其中ID是主键,NAME为员工姓名,NO为工号,TIME为打卡时间
返回的结果应如下:

日期姓名上班时间下班时间
2020-6-9张三2020-6-9 08:45:282020-6-9 18:05:13
2020-6-9李四2020-6-9 08:22:282020-6-9 17:31:08
2020-6-9王五2020-6-9 9:06:182020-6-9 9:06:18

Solution:

IF OBJECT_ID('T','u')IS NOT NULL DROP TABLE T
CREATE TABLE T(
ID INT PRIMARY KEY,
NAME VARCHAR(30) ,
NO INT,
TIME DATETIME,
)
INSERT INTO T
VALUES
(1,'张三',1001,'2020-6-9 08:45:28'),
(2,'李四',1002,'2020-6-9 08:22:2'),
(3,'张三',1001,'2020-6-9 12:13:04'),
(4,'李四',1002,'2020-6-9 17:31:08'),
(5,'王五',1003,'2020-6-9 9:06:18'),
(6,'张三',1001,'2020-6-9 18:05:13')
SELECT distinct CONVERT(date,time) as '日期', NAME AS '姓名',
MIN(time) over(partition by NO) as '上班时间',
MAX(time) over(partition by NO) as '下班时间'
from t

Date:2020/6/8
Topic:
Numbers表保存数字的值和频率

numberfrequency
07
11
23
31

在此表中,数字为0,0,0,0,0,0,0,1,2,2,2,3。中位数是(0+0)/2=0
返回结果应为

median
0

Solution:

IF OBJECT_ID('T','U')IS NOT NULL DROP TABLE T
CREATE TABLE T(
Number int,
frequency int
)
insert into T
VALUES
(0,7),
(1,1),
(2,3),
(3,1)

Date:2020/6/5
Topic:
有如下一张表T

Num
1
2
3
4
5
6
7
8
9

求出每3个或2个相加的和等于10,可能的结果如下:

Num1Num2Num3
127
136
145
235
19NULL
28NULL
37NULL
46NULL
IF OBJECT_ID('T','U')IS NOT NULL DROP TABLE T

CREATE TABLE T (
Num int
)

INSERT INTO T 
values
(1),(2),(3),(4),(5),(6),(7),(8),(9)

--特别注意:需要考虑重复的状况
SELECT a.Num,b.Num as Num1,c.Num as Num2 FROM T a
cross join T b  
cross join T c 
where a.num+b.num+c.num=10 and a.num<>b.num and a.num<>c.num and b.num<>c.num and a.num<b.num and b.num<c.num
union all
select a.num as num1,b.num as num2,null as num3 from T a
cross join T b 
WHERE A.Num+B.Num=10 AND A.Num<>B.Num  and a.Num<b.Num 


Date:2020/6/4
Topic:
有如下一张表Team,里面有Name和Person两个字段

NamePerson
二队15
三队14
一队18
七队11
九队12
四队20

希望按中文队名进行排序,得到的结果应如下:

NamePerson
一队18
二队15
三队14
四队20
七队11
九队12

Solution:

IF OBJECT_ID('Team','u')IS NOT NULL DROP TABLE Team

CREATE TABLE Team(
Name varchar(30),
Person int
)

INSERT INTO Team 
VALUES
(二队,15),
(三队,14),
(一队,18),
(七队,11), 
(九队,12),
(四队,20)

select name,person
from team a
ORDER BY charindex(SUBSTRING(a.name,1,1),'一二三四五六七八九十') asc

Knowledge point:
1.CHARINDEX(expression1, expression2 [,start_location])
表达式1在表达式2中的位置
2.SUBSTRING(expression, start, length)
截取字符串

Date:2020/6/3
Topic:
有一张表TB如下:

HOBBY
登山
羽毛球
游泳
瑜伽
翼装飞行

1.如何得到下面的结果?

HOBBY
登山,羽毛球,游泳,瑜伽,翼装飞行

2.如何通过1得到的结果反向实现表TB?

Solution:

IF OBJECT_ID('TB','U')IS NOT NULL DROP TABLE TB

CREATE TABLE TB(
HOBBY,VARCHAR(30)
)

SERT INTO TB
VALUES ('登山'),('羽毛球'),('游泳'),('瑜伽'),('翼装飞行')

--1
SELECT STUFF((SELECT ','+HOBBY FROM TB for xml path('')),1,1,'') AS HOBBY INTO TB2
SELECT * FROM TB2
--2
declare @x xml 
SET @x=(select HOBBY=cast('<v>'+replace(HOBBY,',','</v><v>')+'</v>' AS xml )
 from TB2 )
select HOBBY=T.c.value('.','varchar(20)')
from @x.nodes('v') T(c)

Date:2020/6/2
Topic:
表 orders 定义如下:order_id(订单编号),customer_id(客户编号),order_date(下单日期)
有以下几条记录:

order_idcustomer_idorder_date
1120200520
2220200521
3220200522
4320200523
5420200524
6420200525

在表 orders 中找到订单数最多客户对应的 customer_id

Solution:

IF OBJECT_ID('TB','U')IS NOT NULL DROP TABLE TB

CREATE TABLE TB (
order_id int,
customer_id int,
order_date varchar(30)
)

INSERT INTO TB 
VALUES
(1,1,20200520),
(2,2,20200521),
(3,2,20200522),
(4,3,20200523),
(5,4,20200524),
(6,4,20200525)

SELECT  B.customer_id  
FROM 
(SELECT * ,RANK() OVER (ORDER BY A.COUNT DESC) AS RNK 
FROM (SELECT DISTINCT customer_id,COUNT(order_date) OVER(PARTITION BY customer_id) AS COUNT
FROM TB)AS A )AS B
WHERE B.RNK=1

Knowledge point:

rank() desc排名dense_rank()desc排名row_number()desc排名
8545
12434
20111
20112
15323

Date:2020/6/1
Topic:
表tb如下,ID为自增,查询出第一条开始到第几条记录 的累计金额刚好超过100?

ID金额
230
330
430
119
121
131
1415
1533
165
178
1814
193

Solution:

IF OBJECT_ID('tb','u') IS NOT NULL DROP TABLE tb

CREATE TABLE tb(
IDX INT IDENTITY(1,1),
ID INT,
amount int
)

INSERT INTO tb(ID,amount)
VALUES 
(2,30),
(3,30),
(4,30),
(11,9),
(12,1),
(13,1),
(14,15),
(15,33),
(16,5),
(17,8),
(18,14),
(19,3)

SELECT MIN(C.IDX) FROM
(SELECT * ,(SELECT SUM(AMOUNT) FROM tb b where (b.id<=a.id))AS SUM
from tb a)AS C 
WHERE C.SUM>100

Knowledge point:
1.自增长identity:
表示该字段的值会自动更新,不需要维护,通常情况下不可以直接给identity修饰的字符赋值,否则编译时会报错
identity(m,n)
m:初始值
n:每次自动增加的值

2.迭代求和

SELECT * ,(SELECT SUM(AMOUNT) FROM tb b where (b.id<=a.id)) from tb a

Date:2020/5/31
Topic:
有一张表T如下

IDPID
10
21
32
43

希望得到如下结果

IDPIDPath
101
211->2
321->2->3
431->2->3->4

Solution:

IF OBJECT_ID('T','U')IS NOT NULL DROP TABLE T

CREATE TABLE T(
ID INT,
PID INT
)

INSERT INTO T
VALUES
(1,0),
(2,1),
(3,2),
(4,3)


  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值