2016-11-28 2 views
3

차를 채울 때마다 다음 표가 표시됩니다. 그것은 날짜, 차량 ID, 해당 시간이 있었다 마일리지를 반환하고 리터 작성 :최대 및 최소 그룹 수는 2 열입니다.

| Date  | Vehicle_ID | Mileage | Liters | 
| 2016-10-20 | 234  | 123456 | 100 | 
| 2016-10-20 | 345  | 458456 | 215 | 
| 2016-10-20 | 323  | 756456 | 265 | 
| 2016-10-25 | 234  | 123800 | 32  | 
| 2016-10-26 | 345  | 459000 | 15  | 
| 2016-10-26 | 323  | 756796 | 46  | 
생각은 (나는 일에 의해 그것을 할 수없는 달의 평균 소비와를 계산하는 것이다

때문에하지 모든 자동차가 매일 탱크를 채 웁니다.)

나는 최대 (마일리지) - 분 (마일리지)/합계 (리터)를 매달 얻으려고했다. 하지만 이것은 특정 차량 1 대와 특정 달 1 대에서만 작동합니다.

특정 자동차 1 대와 몇 달간 사용해 본 경우 최대 및 최소값이 올바르게 반환되지 않습니다. 모든 자동차를 추가하면 더 나빠집니다. 모든 자동차가 마치 같은 것처럼 최대 및 최소를 가정합니다.

select convert(char(7), Date, 127) as year_month, 
     sum("Liters tanked")/(max("Mileage")-min("Mileage"))*100 as Litres_per_100KM 
from Tanking 
where convert(varchar(10),"Date",23) >= DATEADD(mm, -5, GETDATE()) 
group by convert(char(7), Date, 127) 

이것은 모든 자동차의 최대 및 최소를 가정하므로 작동하지 않습니다.

"워크 플로"는 다음과 같음 : - 매월 최대 차량 수와 최소 주행 거리를 확인하십시오. 그 달에 탔던 마일리지를 계산하려면 최대 - 분을 계산하십시오. 각 차량의 주행 거리를 합하여 모든 차량이 주행 할 수있는 총 주행 거리를 계산하십시오. 리터를 탱크에 넣습니다. 전체 리터를 총 주행 거리로 나눕니다. 하위 쿼리에서 한 달에 차 당 금액을 얻을

| YearMonth | Average | 
| 2016-06 | 30  | 
| 2016-07 | 32  | 
| 2016-08 | 46  | 
| 2016-09 | 34  | 
+0

"나는 일에 의해 그것을 할 수없는 모든 자동차 채우기 때문에 탱크 매일 ". 매일 소비량을 매월 소비량을 약 30으로 나눈 값이 아닌가? – Strawberry

+0

안녕하세요 딸기. 아닙니다. "평일의 평균"을 원한다면 그렇게 될 것입니다. 그러나 내가 의미하는 바는 "하루 1 - 평균 X", "2 일 - 평균 Y"등이었습니다. –

+0

출력에는'2016-09','2016-08','2016-07' 행이 포함되어 있습니다. 및 '2016-06'. 그러나 샘플 데이터에는이 개월 동안의 기록이 포함되어 있지 않습니다. 우리가 일할 수 있도록 업데이트 할 수 있습니까? –

답변

1

이는보다 복잡한 문제입니다. 문제는 당신이 몇 달 사이에 마일을 잃고 싶지 않다는 것입니다. 다음과 같이 뭔가를 유혹 :

select year(date), month(date), 
     sum(liters)/(max(mileage) - min(mileage)) 
from Tanking 
where Date >= dateadd(month, -5, getdate()) 
group by year(date), month(date); 

그러나이 마일 리터 그 범위개월 경계를 벗어났습니다. 또한이 달의 첫 번째 기록에있는 리터는 이전의 차이가 있습니다. 죄송합니다. 그건 맞지 않아.

이 문제를 해결하는 한 가지 방법은 다음 값을 찾는 것입니다. 쿼리는 다음과 같습니다.

select year(date), month(date), 
     sum(next_liters)/(max(next_mileage) - min(mileage)) 
from (select t.*, 
      lead(date) over (partition by vehicle_id order by date) as next_date, 
      lead(mileage) over (partition by vehicle_id order by date) as next_mileage, 
      lead(liters) over (partition by vehicle_id order by date) as next_liters 
     from Tanking t 
    ) t 
where Date >= dateadd(month, -5, getdate()) 
group by year(date), month(date); 

이러한 쿼리는 단순화 된 열 이름을 사용하므로 이스케이프 문자가 논리를 방해하지 않습니다.

편집 :

오, 여러 자동차를 (아마도 어떤 vehicle_Id 거기에있다). 두 가지 수준의 집계가 필요합니다. 합니다 (partition by 조항에 vehicle_id와) 두 번째 쿼리에

select yyyy, mm, sum(liters) as liters, sum(mileage_diff) as mileage_diff, 
     sum(mileage_diff)/sum(liters) as mileage_per_liter 
from (select vehicle_id, year(date) as yyyy, month(date) as mm, 
      sum(liters) as liters, 
      (max(mileage) - min(mileage)) as mileage_diff 
     from Tanking 
     where Date >= dateadd(month, -5, getdate()) 
     group by vehicle_year(date), month(date) 
    ) t 
group by yyyy, mm; 

유사 변경 두 번째 버전을 위해 일 것입니다 : 첫 번째 쿼리는 같을 것이다.

+0

대답에 감사드립니다. 우리가 근사치를 원한다고 생각하면 (달을 가로 질러가는 마일리지와 리터를 이해하는 것이 불가능하기 때문에). 첫 번째 쿼리는 작동하지 않을 것입니다. 30 대의 자동차가 있다고 상상해보십시오. 최대 주행 거리는 주행 거리가 500k 마일 인 자동차 1에서 가능하며 최소 거리는 10 마일 인 자동차 21에서 가능합니다. 이번 달에 모든 자동차가 10 마일을 탔을지라도 총 마일리지는 300 마일이되어야합니다. 그러나 최대 (마일리지) - 분 (마일리지)은 500k - 10miles를 반환합니다. 그건 내 문제입니다 - 각 자동차의 최대 및 최소 차이를 어떻게 구할 수 있습니까? –

+0

감사합니다. 그게 효과가있어! –

0

시도 :

어떻게 결과를 얻을 수 있습니다. 그런 다음 하위 쿼리의 값을 사용하여 외부 쿼리에서 월간 평균을 계산하십시오.

select year_month, 
     (1.0*sum(liters_per_car)/sum(mileage_per_car))*100.0 as Litres_per_100KM 
from (
    select convert(char(7), [Date], 127) as year_month,  
      sum(Liters) as liters_per_car, 
      max(Mileage)-min(Mileage) as mileage_per_car  
    from Tanking 
    group by convert(char(7), [Date], 127), Vehicle_ID) as t 
group by year_month 
0

당신은 DIF 얻을 수있는 CTE를 사용 (주행 거리)하고 소비를 계산할 수 있습니다

여기를 확인할 수 있습니다 http://rextester.com/OKZO55169

with cte (car, datec, difm, liters) 
as 
(
select 
    car, 
    datec, 
    mileage - lag(mileage,1,mileage) over(partition by car order by car, mileage) as difm, 
    liters 
from #consum 
) 
select 
    car, 
    year(datec) as [year], 
    month(datec) as [month], 
    ((cast(sum(liters) as float)/cast(sum(difm) as float)) * 100.0) as [l_100km] 
from 
    cte 
group by 
    car, year(datec), month(datec) 
+0

감사합니다. 그것도 잘 작동한다! –