Правильный вложенный запрос - PullRequest
2 голосов
/ 06 марта 2020

Когда я запускаю следующие T- SQL

use xxx

select      
    t.Vehicle,
    t.Distance,
    t.FuelConsumption,
    d.LastConnection,
    v.Make,
    v.Model
from
    dbo.Trips t
left join   
    dbo.Vehicles v on v.Id = t.Vehicle
left join   
    dbo.Devices d on d.Id = v.DeviceId
where       
    t.Date > '2020-03-02' and Distance > 1
order by    
    t.Vehicle, t.FuelConsumption 

, в результате я получаю 34 строки, которые выглядят так:

enter image description here

Первый автомобиль ID 76 совершил 2 поездки, 1 зарегистрированное топливо другой не сделал. Это то, что я пытаюсь установить sh.

Поэтому я попытался выполнить следующий вложенный запрос

 select     
     t.Vehicle,
     d.LastConnection,
     v.Make,
     v.Model,
     count(t.id) as TripCount,
     sum(NoFuelRecord) as NoFuelRecord,
     sum(FuelRecorded) as FuelRecorded          
from
    (select count(Id) as NoFuelRecord
     from dbo.Trips 
     where Distance > 1 and FuelConsumption <= 0 and Date > '2020-03-02'
     group by Vehicle)  as NoFuelRecord,
    (select count(Id) as FuelRecorded
     from dbo.Trips 
     where Distance > 1 and FuelConsumption > 0 and Date > '2020-03-02'
     group by Vehicle) as FuelRecorded,
    dbo.Trips t         
left join   
    dbo.Vehicles v on v.Id = t.Vehicle
left join   
    dbo.Devices d on d.Id = v.DeviceId
where
    t.Date > '2020-03-02' and Distance > 1
group by
    t.Vehicle, v.Make, v.Model, d.LastConnection
order by    
    t.Vehicle

, который дал следующие результаты:

enter image description here

Так что я ожидаю увидеть в строке 1: TripCount: 2, NoFuelRecord: 1, FuelRecorded: 1

Я даже не близко! Как мне это сделать, пожалуйста?

1 Ответ

2 голосов
/ 06 марта 2020

Трудно отследить, почему ваш запрос не возвращает ожидаемый результат. Но исходя из вашего исходного запроса и ожидаемых результатов, которые вы описали, это должно дать вам то, что вы хотите после

WITH CTE as (
SELECT      t.Vehicle,
            t.Distance,
            t.FuelConsumption,
            t.Id,
            d.LastConnection,
            v.Make,
            v.Model
FROM        dbo.Trips t
LEFT JOIN   dbo.Vehicles v on v.Id = t.Vehicle
LEFT JOIN   dbo.Devices d on d.Id = v.DeviceId
WHERE       t.Date > '2020-03-02' and Distance > 1
)
SELECT Vehicle,
            LastConnection,
            Make,
            Model,
            COUNT(Id) AS TripCount,
            SUM(CASE WHEN FuelConsumption > 0 THEN 1 ELSE 0 END) AS FuelRecorded,
            SUM(CASE WHEN FuelConsumption <= 0 THEN 1 ELSE 0 END) AS NoFuelRecorded 
FROM CTE 
GROUP BY  Vehicle,
            LastConnection,
            Make,
            Model
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...