【问题标题】:SQL Find the last time the car and parts has been used and how many work hoursSQL 查找最后一次使用汽车和零件的时间以及工作时间
【发布时间】:2018-01-05 11:13:16
【问题描述】:

大家好,我正在尝试创建一个查询,该查询将给我上次使用汽车的时间以及使用了多少小时的某些部件我正在尝试使用 SELECT MAX (DateRef) 但它只给我一个数据汽车,我想为每辆车最后一次使用和零件的时间。由于我不是数据库开发人员,而是系统管理员,就我目前的知识而言,这看起来有点困难。我希望有人能帮助我。

SELECT distinct  c.CarID
, DateRef
, StartHours
, a.SerialNumber
, c.CarComponentID
, c.StartHours + c.UsageHours as TTSN
from ComponentUsage c 
inner join Car A ON a.CarID = c.CarID
where c.DateRef <= '2017-12-31' and c.DateRef >= '2017-12-01' 
group by c.CarComponentID
    ,c.CarID
    , a.SerialNumber
    , starthours
    , c.dateref 
    ,c.StartHours + c.UsageHours

CarID   DateRef       StartHours SerialNumber   CarComponentID      TTSN
18  2017-12-01 03:40:00 3135.30    510-0185       71               3136.90
18  2017-12-01 03:40:00 3135.30    510-0185       72               3136.90
18  2017-12-01 03:40:00 3135.30    510-0185       73               3136.90
18  2017-12-01 03:40:00 0.00       510-0185       74               0.00
18  2017-12-01 03:40:00 3135.30    510-0185       75               3136.90
18  2017-12-01 05:56:00 3136.90    510-0185       71               3138.60
18  2017-12-01 05:56:00 3136.90    510-0185       72               3138.60
18  2017-12-01 05:56:00 3136.90    510-0185       73               3138.60
18  2017-12-01 05:56:00 0.00       510-0185       74               0.00
18  2017-12-01 05:56:00 3136.90    510-0185       75               3138.60
2   2017-12-01 06:45:00 6471.80    510-0065        1               6472.70
2   2017-12-01 06:45:00 6267.80    510-0065       15               6268.70
2   2017-12-01 06:45:00 6338.80    510-0065       29               6339.70
2   2017-12-01 06:45:00 1.20       510-0065       43               1.20
2   2017-12-01 06:45:00 6471.50    510-0065       66               6472.40
11  2017-12-01 07:10:00 4736.70    510-0196       10               4737.50
11  2017-12-01 07:10:00 4736.70    510-0196       24               4737.50
11  2017-12-01 07:10:00 4736.70    510-0196       38               4737.50
11  2017-12-01 07:10:00 0.30       510-0196       52               0.30

【问题讨论】:

    标签: sql sql-server-2012


    【解决方案1】:

    这里的一种方法是,不是直接加入Car 表,而是加入一个子查询,我们可以从中识别每辆车的最新记录。下面的子查询为每组汽车记录引入了一个行号,从 1 开始排序,从最近的记录开始。然后,我们通过仅保留每辆车的最新汽车记录来限制加入。

    SELECT c.CarID, DateRef, StartHours, a.SerialNumber, c.CarComponentID,
           c.StartHours + c.UsageHours AS TTSN
    FROM ComponentUsage c 
    INNER JOIN
    (
        SELECT *, ROW_NUMBER() OVER (PARTITION BY CarID ORDER BY DateRef DESC) rn
        FROM Car
    ) a
        ON a.CarID = c.CarID AND a.rn = 1
    WHERE
        c.DateRef BETWEEN '2017-12-01' AND '2017-12-31';
    

    【讨论】:

    • 谢谢,这几乎是我需要的,但它只显示了我需要的汽车的 1 个部分而不是 5 个部分,实际数据还有更多的 carcomponentID
    • 您想要最近使用的 5 个组件,还是其他?
    • 每辆车都有 5 个部件使用,轮胎、刹车等我需要显示车号,希望你能理解我
    • 谢谢蒂姆,不幸的是我得到了超过 2500 行实际上这件事让我发疯了我有超过 2 天的时间花在这份报告上;(所以日期没有写我也改变了FROM from WITH case with componentUsage 因为 dateref 在表 componentUsage
    • 我觉得你的数据库设计有问题。你能告诉我如何只保留 5 个汽车零件的逻辑吗?上面的查询将返回所有部分,这显然不是你想要的。
    【解决方案2】:

    大家好,我正在尝试创建一个查询,该查询将为我提供上次使用汽车的时间以及使用某些零件的小时数

    如果这是任务,也许这会有所帮助:

    create procedure dbo.get_Cars_Last_Usage_And_Component_Time_sp
    as
    
    declare @s nvarchar(max) = ''
    declare @s1 as nvarchar(max) = ''
    declare @s2 as nvarchar(max) = ''
    
    select @s1 = @s1 + '[' + cast( CarComponentID as varchar(10)) + '],'
    from 
    (
        select distinct CarComponentID
        from ComponentUsage
    ) a
    
    if len(@s1) > 0
    select @s1 = substring(@s1, 1, len(@s1) - 1)
    
    
    select @s2 = @s2 + 'sum(coalesce([' + cast( CarComponentID as varchar(10)) + '], 0)) [PartNo ' + cast( CarComponentID as varchar(10)) + '],'
    from 
    (
        select distinct CarComponentID
        from ComponentUsage
    ) a
    
    if len(@s2) > 0
    select @s2 = substring(@s2, 1, len(@s2) - 1)
    
    set @s =
    '
    select CarID, max(DateRef) [last time a car were used], ' + @s2 + '
    from
    (
        select *
        from ComponentUsage
    ) AS SourceTable
    pivot
    (
        sum(TTSN)
        FOR CarComponentID in(' + @s1 + ')
    ) AS PivotTable
    group by CarID
    '
    
    exec sp_executesql @s
    

    会给你这样的输出:

    【讨论】:

      猜你喜欢
      • 2014-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-29
      • 1970-01-01
      • 2014-01-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多