这是某公司的一份SQL Server数据分析面试题,总共有4道题,此处挑选了其中的3道,另外1道比较简单,就不列出来了。

    第一题:

    题目:写一个SQL函数,能将一串字符串按指定的分隔符拆分成行。比如给定字符串"查询,入库,出库,移库,盘点,设置",查询出来的结果是:

SQL Server数据分析面试题_SQL Server

    审题:这是一道典型的Split函数题。看过一些写法,可以一段一段地截取,可以使用反转等等,但是核心的知识点就是Index。

    做题:下面是我的写法,仅供参考。

CREATE FUNCTION [dbo].[Split](@Text NVARCHAR(4000),@SplitSymbol NVARCHAR(4000))  RETURNS @ResultTable TABLE ([VALUE] NVARCHAR(4000)) AS BEGIN --变量定义 DECLARE @StartIndex INT   --开始位置 DECLARE @FindIndex INT   --找到位置 DECLARE @Content NVARCHAR(4000) --找到内容  --变量初始化 SET @StartIndex=1    --T-SQL查找位置是从1开始的 SET @FindIndex=0   --循环查找字符串分割符 WHILE (@StartIndex<=LEN(@Text)) BEGIN  --返回查找位置  SELECT @FindIndex=CHARINDEX(@SplitSymbol,@Text,@StartIndex)  --查找位置返回0表示已查找完毕  IF (ISNULL(@FindIndex,0)=0)  BEGIN   SET @FindIndex=LEN(@Text)+1  END     --截取字符串  SET @Content=LTRIM(RTRIM(SUBSTRING(@Text,@StartIndex,@FindIndex-@StartIndex)))  --初始化下次开始位置  SET @StartIndex=@FindIndex+1  --找到值插入结果表  INSERT INTO @ResultTable ([VALUE]) VALUES (@Content) END RETURNEND

    执行:

SELECT * FROM Split('查询,入库,出库,移库,盘点,设置',',')

    第二题:

    题目:对于以下数据,补充一段SQL代码,计算出每个步骤的计划开始时间。

    原数据:

SQL Server数据分析面试题_SQL Server_02

    需要的结果:

SQL Server数据分析面试题_SQL Server_03

    原始数据:

declare @t as table ([产品] nvarchar(50), [工序] nvarchar(50), [加工顺序] int, [加工时间] int, [计划开始时间] datetime)insert @t values  ('item-a', '备布', 1, 120, '2020-06-26 10:00:00'), ('item-a', '染色', 2, 480, null), ('item-a', '烘干', 3, 120, null), ('item-a', '查布', 4, 60, null), ('item-a', '定型过软', 5, 120, null), ('item-a', '成品检验', 6, 60, null), ('item-a', '入仓', 7, 60, null), ('item-b', '备布', 1, 120, '2020-06-24 06:00:00'), ('item-b', '预定型', 2, 180, null), ('item-b', '染色', 3, 480, null), ('item-b', '烘干', 4, 120, null), ('item-b', '查布', 5, 60, null), ('item-b', '定型过软', 6, 120, null), ('item-b', '成品检验', 7, 60, null), ('item-b', '入仓', 8, 60, null)

    -- 请在此加入代码更新【计划开始时间】。

    -- 每个产品下一步的开始时间等于上一步的【计划开始时间】加上【加工时间】。【加工时间】的单位为分钟。

    -- 比如【item-a】的第2步【染色】的计划开始时间.........