SQL。循环遍历不同表中的列以计算值

SQL。循环遍历不同表中的列以计算值,sql,for-loop,while-loop,case,Sql,For Loop,While Loop,Case,我想计算一下有多少司机开得太快了。我有一张桌子 交通。 在每行的这个表格中,我可以看到有多少辆车以不同的速度行驶。对于这个问题,我只需要列amount\u drivers1到amount\u drivers10 在speedcategories表中,我有十个不同的速度类别(例如speed_categorie第1-10列的值为:20,30,40,50,60,70,80,90100110) 每种方式都不同。对于每行,我必须找到每种方式的速度类别。速度分类1与数量驱动1相关,速度分类2与数量驱动2相关

我想计算一下有多少司机开得太快了。我有一张桌子 交通。 在每行的这个表格中,我可以看到有多少辆车以不同的速度行驶。对于这个问题,我只需要列amount\u drivers1到amount\u drivers10

在speedcategories表中,我有十个不同的速度类别(例如speed_categorie第1-10列的值为:20,30,40,50,60,70,80,90100110) 每种方式都不同。对于每行,我必须找到每种方式的速度类别。速度分类1与数量驱动1相关,速度分类2与数量驱动2相关

然后我必须使用表max_speed中的max_speed列。我必须遍历每个speed_categorie列,看看speed_categorie是否高于max_speed列。如果不是什么都不做,如果是,则交通表中的车辆数量(列amount\u drivers的值)必须计入列“to\u hard”

最大速度、速度类别和交通表之间的关系是id号。这些是外键。这是示意图:


例如,最大速度=60(来自最大速度表)。然后,只有速度类别70、80、90100和110(来自速度分类表)符合条件。然后,amount_drivers6、amount_drivers7、amount_drivers8、amount_drivers9和mount_drivers10(来自流量表)中的驱动程序数量必须在“to_hard”列中。在本例中,这是amount\u drivers6、amount\u drivers7、amount\u drivers8、amount\u drivers9和mount\u drivers10列的总和。这个总数必须在“to_hard”列中。

首先尝试这个SP,
EXEC check overspeed 1
获取way1的总数,其余的也一样,如果您需要自动获取所有方式的列表,请告诉我,但我能想到的第一件事是使用
游标,如果您熟悉这一点,您可以对我的SP进行更改

CREATE PROCEDURE CheckOverSpeed

(@ID_input INT)

AS
BEGIN

DECLARE @amount_drivers1 INT
DECLARE @amount_drivers2 INT
DECLARE @amount_drivers3 INT
DECLARE @amount_drivers4 INT
DECLARE @amount_drivers5 INT
DECLARE @amount_drivers6 INT
DECLARE @amount_drivers7 INT
DECLARE @amount_drivers8 INT
DECLARE @amount_drivers9 INT
DECLARE @amount_drivers10 INT


DECLARE @SPEED_CAT1 INT
DECLARE @SPEED_CAT2 INT
DECLARE @SPEED_CAT3 INT
DECLARE @SPEED_CAT4 INT
DECLARE @SPEED_CAT5 INT
DECLARE @SPEED_CAT6 INT
DECLARE @SPEED_CAT7 INT
DECLARE @SPEED_CAT8 INT
DECLARE @SPEED_CAT9 INT
DECLARE @SPEED_CAT10 INT


DECLARE @MAX_SPEED_ID INT
DECLARE @ID INT
DECLARE @SUM INT = 0

SELECT @ID = @ID_input, 
       @amount_drivers1 = T.amount_drivers1,
       @amount_drivers2 = T.amount_drivers2,
       @amount_drivers3 = T.amount_drivers3,
       @amount_drivers4 = T.amount_drivers4,
       @amount_drivers5 = T.amount_drivers5,
       @amount_drivers6 = T.amount_drivers6,
       @amount_drivers7 = T.amount_drivers7,
       @amount_drivers8 = T.amount_drivers8,
       @amount_drivers9 = T.amount_drivers9,
       @amount_drivers10 = T.amount_drivers10,

       @SPEED_CAT1 = S.SPEED_CAT1,
       @SPEED_CAT2 = S.SPEED_CAT2,
       @SPEED_CAT3 = S.SPEED_CAT3,
       @SPEED_CAT4 = S.SPEED_CAT4,
       @SPEED_CAT5 = S.SPEED_CAT5,
       @SPEED_CAT6 = S.SPEED_CAT6,
       @SPEED_CAT7 = S.SPEED_CAT7,
       @SPEED_CAT8 = S.SPEED_CAT8,
       @SPEED_CAT9 = S.SPEED_CAT9,
       @SPEED_CAT10 = S.SPEED_CAT10,

       @MAX_SPEED_ID = M.MAX_SPEED_ID

FROM
TRAFFIC as T 
INNER JOIN MAX_SPEED as M
ON M.MAX_SPEED_ID = T.ID
INNER JOIN SPPED_CATEGORIES as S
ON S.ID = T.ID
WHERE T.ID = @ID

SET @SUM = CASE WHEN  @SPEED_CAT1<@MAX_SPEED_ID THEN 0 ELSE @amount_drivers1 END +
           CASE WHEN  @SPEED_CAT2<@MAX_SPEED_ID THEN 0 ELSE @amount_drivers2 END +
           CASE WHEN  @SPEED_CAT3<@MAX_SPEED_ID THEN 0 ELSE @amount_drivers3 END +
           CASE WHEN  @SPEED_CAT4<@MAX_SPEED_ID THEN 0 ELSE @amount_drivers4 END +
           CASE WHEN  @SPEED_CAT5<@MAX_SPEED_ID THEN 0 ELSE @amount_drivers5 END +
           CASE WHEN  @SPEED_CAT6<@MAX_SPEED_ID THEN 0 ELSE @amount_drivers6 END +
           CASE WHEN  @SPEED_CAT7<@MAX_SPEED_ID THEN 0 ELSE @amount_drivers7 END +
           CASE WHEN  @SPEED_CAT8<@MAX_SPEED_ID THEN 0 ELSE @amount_drivers8 END +
           CASE WHEN  @SPEED_CAT9<@MAX_SPEED_ID THEN 0 ELSE @amount_drivers9 END +
           CASE WHEN  @SPEED_CAT10<@MAX_SPEED_ID THEN 0 ELSE @amount_drivers10 END

PRINT 'The total number of over speed drivers for way '+CAST(@ID as varchar(50)) + ' is '+ CAST(@SUM as varchar(100)) 

END
创建过程检查
(@ID_input INT)
作为
开始
声明@amount\u drivers1 INT
声明@amount\u drivers2 INT
声明@amount\u drivers3 INT
声明@amount\u drivers4 INT
声明@amount\u drivers5 INT
声明@amount\u drivers6 INT
声明@amount\u drivers7 INT
声明@amount\u drivers8 INT
声明@amount\u drivers9 INT
声明@amount\u drivers10 INT
声明@SPEED_CAT1 INT
声明@SPEED_CAT2 INT
声明@SPEED_CAT3 INT
声明@SPEED_CAT4 INT
声明@SPEED_CAT5 INT
声明@SPEED_CAT6 INT
声明@SPEED_CAT7 INT
声明@SPEED_CAT8 INT
声明@SPEED_CAT9 INT
声明@SPEED_CAT10 INT
声明@MAX\u SPEED\u ID INT
声明@ID INT
声明@SUM INT=0
选择@ID=@ID\u输入,
@金额驱动因素1=T.金额驱动因素1,
@金额驱动因素2=T.金额驱动因素2,
@金额驱动因素3=T.金额驱动因素3,
@金额驱动因素4=T.金额驱动因素4,
@金额驱动因素5=T.金额驱动因素5,
@金额驱动6=T.金额驱动6,
@金额驱动7=T.金额驱动7,
@金额驱动8=T.金额驱动8,
@金额驱动9=T.金额驱动9,
@金额驱动力10=T.金额驱动力10,
@速度\u CAT1=S.速度\u CAT1,
@速度_CAT2=S.速度_CAT2,
@速度\u CAT3=S.速度\u CAT3,
@速度_CAT4=S.速度_CAT4,
@速度_CAT5=S.速度_CAT5,
@速度_CAT6=S.速度_CAT6,
@速度_CAT7=S.速度_CAT7,
@速度\u CAT8=S.速度\u CAT8,
@速度\u CAT9=S.速度\u CAT9,
@速度\u CAT10=S.速度\u CAT10,
@最大速度ID=M.MAX\u速度ID
从…起
作为T的流量
内连接最大速度为M
在M.MAX_速度_ID=T.ID上
内部连接SPPED_类别为S
在S.ID=T.ID上
其中T.ID=@ID

设置@SUM=CASE当@SPEED_CAT1首先尝试此SP时,
EXEC check overspeed 1
获取way1的总计,其余部分相同,如果您需要自动获取所有方式的列表,请告诉我,但我能想到的第一件事是使用
游标
,如果您熟悉此功能,可以对我的SP进行更改

CREATE PROCEDURE CheckOverSpeed

(@ID_input INT)

AS
BEGIN

DECLARE @amount_drivers1 INT
DECLARE @amount_drivers2 INT
DECLARE @amount_drivers3 INT
DECLARE @amount_drivers4 INT
DECLARE @amount_drivers5 INT
DECLARE @amount_drivers6 INT
DECLARE @amount_drivers7 INT
DECLARE @amount_drivers8 INT
DECLARE @amount_drivers9 INT
DECLARE @amount_drivers10 INT


DECLARE @SPEED_CAT1 INT
DECLARE @SPEED_CAT2 INT
DECLARE @SPEED_CAT3 INT
DECLARE @SPEED_CAT4 INT
DECLARE @SPEED_CAT5 INT
DECLARE @SPEED_CAT6 INT
DECLARE @SPEED_CAT7 INT
DECLARE @SPEED_CAT8 INT
DECLARE @SPEED_CAT9 INT
DECLARE @SPEED_CAT10 INT


DECLARE @MAX_SPEED_ID INT
DECLARE @ID INT
DECLARE @SUM INT = 0

SELECT @ID = @ID_input, 
       @amount_drivers1 = T.amount_drivers1,
       @amount_drivers2 = T.amount_drivers2,
       @amount_drivers3 = T.amount_drivers3,
       @amount_drivers4 = T.amount_drivers4,
       @amount_drivers5 = T.amount_drivers5,
       @amount_drivers6 = T.amount_drivers6,
       @amount_drivers7 = T.amount_drivers7,
       @amount_drivers8 = T.amount_drivers8,
       @amount_drivers9 = T.amount_drivers9,
       @amount_drivers10 = T.amount_drivers10,

       @SPEED_CAT1 = S.SPEED_CAT1,
       @SPEED_CAT2 = S.SPEED_CAT2,
       @SPEED_CAT3 = S.SPEED_CAT3,
       @SPEED_CAT4 = S.SPEED_CAT4,
       @SPEED_CAT5 = S.SPEED_CAT5,
       @SPEED_CAT6 = S.SPEED_CAT6,
       @SPEED_CAT7 = S.SPEED_CAT7,
       @SPEED_CAT8 = S.SPEED_CAT8,
       @SPEED_CAT9 = S.SPEED_CAT9,
       @SPEED_CAT10 = S.SPEED_CAT10,

       @MAX_SPEED_ID = M.MAX_SPEED_ID

FROM
TRAFFIC as T 
INNER JOIN MAX_SPEED as M
ON M.MAX_SPEED_ID = T.ID
INNER JOIN SPPED_CATEGORIES as S
ON S.ID = T.ID
WHERE T.ID = @ID

SET @SUM = CASE WHEN  @SPEED_CAT1<@MAX_SPEED_ID THEN 0 ELSE @amount_drivers1 END +
           CASE WHEN  @SPEED_CAT2<@MAX_SPEED_ID THEN 0 ELSE @amount_drivers2 END +
           CASE WHEN  @SPEED_CAT3<@MAX_SPEED_ID THEN 0 ELSE @amount_drivers3 END +
           CASE WHEN  @SPEED_CAT4<@MAX_SPEED_ID THEN 0 ELSE @amount_drivers4 END +
           CASE WHEN  @SPEED_CAT5<@MAX_SPEED_ID THEN 0 ELSE @amount_drivers5 END +
           CASE WHEN  @SPEED_CAT6<@MAX_SPEED_ID THEN 0 ELSE @amount_drivers6 END +
           CASE WHEN  @SPEED_CAT7<@MAX_SPEED_ID THEN 0 ELSE @amount_drivers7 END +
           CASE WHEN  @SPEED_CAT8<@MAX_SPEED_ID THEN 0 ELSE @amount_drivers8 END +
           CASE WHEN  @SPEED_CAT9<@MAX_SPEED_ID THEN 0 ELSE @amount_drivers9 END +
           CASE WHEN  @SPEED_CAT10<@MAX_SPEED_ID THEN 0 ELSE @amount_drivers10 END

PRINT 'The total number of over speed drivers for way '+CAST(@ID as varchar(50)) + ' is '+ CAST(@SUM as varchar(100)) 

END
创建过程检查
(@ID_input INT)
作为
开始
声明@amount\u drivers1 INT
声明@amount\u drivers2 INT
声明@amount\u drivers3 INT
声明@amount\u drivers4 INT
声明@amount\u drivers5 INT
声明@amount\u drivers6 INT
声明@amount\u drivers7 INT
声明@amount\u drivers8 INT
声明@amount\u drivers9 INT
声明@amount\u drivers10 INT
声明@SPEED_CAT1 INT
声明@SPEED_CAT2 INT
声明@SPEED_CAT3 INT
声明@SPEED_CAT4 INT
声明@SPEED_CAT5 INT
声明@SPEED_CAT6 INT
声明@SPEED_CAT7 INT
声明@SPEED_CAT8 INT
声明@SPEED_CAT9 INT
声明@SPEED_CAT10 INT
声明@MAX\u SPEED\u ID INT
声明@ID INT
声明@SUM INT=0
选择@ID=@ID\u输入,
@金额驱动因素1=T.金额驱动因素1,
@金额驱动因素2=T.金额驱动因素2,
@金额驱动因素3=T.金额驱动因素3,
@金额驱动因素4=T.金额驱动因素4,
@金额驱动因素5=T.金额驱动因素5,
@金额驱动6=T.金额驱动6,
@金额驱动7=T.金额驱动7,
@金额驱动8=T.金额驱动8,
@金额驱动9=T.金额驱动9,
@金额驱动力10=T.金额驱动力10,
@速度\u CAT1=S.速度\u CAT1,
@速度_CAT2=S.速度_CAT2,
@速度\u CAT3=S.速度\u CAT3,
@速度_CAT4=S.速度_CAT4,
@速度_CAT5=S.速度_CAT5,
@速度_CAT6=S.速度_CAT6,
@速度_CAT7=S.速度_CAT7,
@速度\u CAT8=S.速度\u CAT8,
@速度\u CAT9=S.速度\u CAT9,
@速度\u CAT10=S.速度\u CAT10,
@最大速度ID=M.MAX\u速度ID
从…起
作为T的流量
内连接最大速度为M
在M.MAX_速度_ID=T.ID上
内部连接SPPED_类别为S
在S.ID=T.ID上
其中T.ID=@ID

首先设置@SUM=CASE当@SPEED_CAT1时,这不是一个好的表结构。如果要存储此类数据,最好创建另一个键并将
amount\u drivers
列存储为多行上的单个列。这同样适用于
SPEED\u CAT
。事实上,没有太多理由使用
SPEE