2条回答 默认 最新
- benbenli 2021-05-11 21:07关注
第一题定义了一个函数循环检查前一天类型是否为B并累计工期。
CREATE TABLE Project ( Type Char(1), Duration Int, Sequence Date ); INSERT INTO Project VALUES ('A', 10, '2021-01-01'), ('A', 10, '2021-01-02'), ('B', 10, '2021-01-03'), ('A', 10, '2021-01-04'), ('B', 10, '2021-01-05'), ('B', 10, '2021-01-06'), ('B', 10, '2021-01-07'), ('A', 10, '2021-01-08'), ('B', 10, '2021-01-09'), ('A', 10, '2021-01-10'); IF OBJECT_ID (N'dbo.udfRollupPreviousDuration', N'FN') IS NOT NULL DROP FUNCTION udfRollupPreviousDuration; GO CREATE FUNCTION dbo.udfRollupPreviousDuration(@Sequence Date) RETURNS int AS BEGIN DECLARE @PreviousDay DATE; DECLARE @Type Char(1); DECLARE @Duration Int; DECLARE @TotalDuration Int SET @TotalDuration = 0 SET @PreviousDay = DATEADD(DAY, -1, @Sequence); WHILE 1 = 1 BEGIN --PRINT CONCAT('@PreviousDay=', @PreviousDay); SELECT @Type = Type, @Duration = Duration FROM Project WHERE Sequence = @PreviousDay IF @Type IS NULL OR @Type <> 'B' BREAK; --PRINT CONCAT('@Duration=', STR(@Duration)); SET @TotalDuration = @TotalDuration + @Duration; SET @PreviousDay = DATEADD(DAY, -1, @PreviousDay); END RETURN @TotalDuration; END; SELECT Sequence, Duration + dbo.udfRollupPreviousDuration(Sequence) AS TotalDuration FROM Project ORDER BY Sequence ; // Results: 2021-01-01 10 2021-01-02 10 2021-01-03 10 2021-01-04 20 2021-01-05 10 2021-01-06 20 2021-01-07 30 2021-01-08 40 2021-01-09 10 2021-01-10 20
第二题比较容易,分别用子铲鲟求和再相减。
SELECT (SELECT SUM(Amt) FROM Receivable) - (SELET SUM(Amt) FROM Payable) AS Balance
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用
悬赏问题
- ¥15 鼠标右键,撤销删除 复制 移动,要怎样删除
- ¥15 使用MATLAB进行余弦相似度计算加速
- ¥15 服务器安装php5.6版本
- ¥15 我想用51单片机和数码管做一个从0开始的计数表 我写了一串代码 但是放到单片机里面数码管只闪烁一下然后熄灭
- ¥20 系统工程中,状态空间模型中状态方程的应用。请猛男来完整讲一下下面所有问题
- ¥15 我想在WPF的Model Code中获取ViewModel Code中的一个参数
- ¥15 arcgis处理土地利用道路 建筑 林地分类
- ¥20 使用visual studio 工具用C++语音,调用openslsx库读取excel文件的sheet问题
- ¥100 寻会做云闪付tn转h5支付链接的技术
- ¥15 DockerSwarm跨节点无法访问问题