149 lines
5.6 KiB
SQL
149 lines
5.6 KiB
SQL
#namespace("Degree")
|
||
-- 指定时间范围内,指定场站的充电度数,有峰平谷和总量
|
||
#sql("getDegree")
|
||
WITH station_list AS (
|
||
SELECT id AS station_id, station_name
|
||
FROM t_station
|
||
WHERE 1=1
|
||
#if(station_names)
|
||
AND station_name IN (#para(station_names))
|
||
#end
|
||
),
|
||
charge_data AS (
|
||
-- 12月指定场站的充电信息,计算每条记录的充电量和时段
|
||
SELECT
|
||
teco.station_id,
|
||
sl.station_name,
|
||
teco.charge_end_degree - teco.charge_begin_degree AS charge_amount,
|
||
HOUR(teco.charge_begin_time) AS hour_of_day
|
||
FROM t_equipment_charge_order teco
|
||
INNER JOIN station_list sl ON teco.station_id = sl.station_id
|
||
WHERE 1=1
|
||
#if(start_time)
|
||
AND teco.charge_begin_time >= #para(start_time)
|
||
#end
|
||
#if(end_time)
|
||
AND teco.charge_begin_time <= #para(end_time)
|
||
#end
|
||
)
|
||
-- 统计各场站峰、平、谷时段的充电量(保留3位小数)
|
||
SELECT
|
||
station_id,
|
||
station_name,
|
||
-- 峰时段:8:00-11:00,18:00-21:00
|
||
ROUND(SUM(CASE
|
||
WHEN (hour_of_day >= 8 AND hour_of_day < 11)
|
||
OR (hour_of_day >= 18 AND hour_of_day < 21)
|
||
THEN charge_amount ELSE 0
|
||
END), 3) AS peak_charging_amount,
|
||
|
||
-- 平时段:11:00-18:00,21:00-22:00
|
||
ROUND(SUM(CASE
|
||
WHEN (hour_of_day >= 11 AND hour_of_day < 18)
|
||
OR (hour_of_day >= 21 AND hour_of_day < 22)
|
||
THEN charge_amount ELSE 0
|
||
END), 3) AS flat_charging_amount,
|
||
|
||
-- 谷时段:22:00-次日8:00(跨天处理)
|
||
ROUND(SUM(CASE
|
||
WHEN hour_of_day >= 22 OR hour_of_day < 8
|
||
THEN charge_amount ELSE 0
|
||
END), 3) AS valley_charging_amount,
|
||
|
||
-- 充电量总量
|
||
ROUND(SUM(charge_amount), 3) AS total_charging_amount
|
||
FROM charge_data
|
||
GROUP BY station_id, station_name
|
||
ORDER BY total_charging_amount DESC
|
||
#if(!station_names)
|
||
LIMIT 10
|
||
#end
|
||
;
|
||
#end
|
||
|
||
#sql("getStationList")
|
||
select id,station_name from t_station
|
||
#end
|
||
|
||
-- 查询近3个月的充电趋势及变化
|
||
#sql("getTrendChange")
|
||
WITH monthly_data AS (
|
||
SELECT
|
||
ts.station_name,
|
||
DATE_FORMAT(teco.charge_begin_time, '%Y-%m') as month_str,
|
||
SUM(teco.charge_end_degree - teco.charge_begin_degree) as monthly_total
|
||
FROM t_equipment_charge_order teco
|
||
JOIN t_station ts ON teco.station_id = ts.id
|
||
WHERE teco.charge_begin_time >= #para(start_time)
|
||
AND teco.charge_begin_time <= #para(end_time)
|
||
GROUP BY ts.station_name, month_str
|
||
),
|
||
pivoted_data AS (
|
||
SELECT
|
||
station_name,
|
||
MAX(CASE WHEN month_str = #para(month1) THEN monthly_total ELSE 0 END) as m1_total,
|
||
MAX(CASE WHEN month_str = #para(month2) THEN monthly_total ELSE 0 END) as m2_total,
|
||
MAX(CASE WHEN month_str = #para(month3) THEN monthly_total ELSE 0 END) as m3_total
|
||
FROM monthly_data
|
||
GROUP BY station_name
|
||
)
|
||
SELECT
|
||
station_name,
|
||
ROUND(m1_total, 2) as month1_total,
|
||
ROUND(m2_total, 2) as month2_total,
|
||
ROUND(m3_total, 2) as month3_total,
|
||
ROUND(m3_total - m1_total, 2) as net_change,
|
||
ROUND(ABS(m3_total - m1_total), 2) as abs_change
|
||
FROM pivoted_data
|
||
ORDER BY abs_change DESC
|
||
LIMIT 10
|
||
#end
|
||
|
||
-- 获取指定时间内,按企业充电量由大到小TOP 10
|
||
#sql("getCompanyTop10")
|
||
WITH charge_data AS (
|
||
SELECT
|
||
tc.company_name,
|
||
teco.charge_degree as charge_amount,
|
||
HOUR(teco.charge_begin_time) AS hour_of_day
|
||
FROM t_equipment_charge_order teco
|
||
INNER JOIN t_user as tu ON teco.user_id = tu.id
|
||
INNER JOIN t_company tc ON tc.id = tu.user_owner_id
|
||
WHERE 1=1
|
||
#if(start_time)
|
||
AND teco.charge_begin_time >= #para(start_time)
|
||
#end
|
||
#if(end_time)
|
||
AND teco.charge_begin_time <= #para(end_time)
|
||
#end
|
||
)
|
||
SELECT
|
||
company_name,
|
||
-- 峰时段:8:00-11:00,18:00-21:00
|
||
ROUND(SUM(CASE
|
||
WHEN (hour_of_day >= 8 AND hour_of_day < 11)
|
||
OR (hour_of_day >= 18 AND hour_of_day < 21)
|
||
THEN charge_amount ELSE 0
|
||
END), 2) AS peak_charging_amount,
|
||
|
||
-- 平时段:11:00-18:00,21:00-22:00
|
||
ROUND(SUM(CASE
|
||
WHEN (hour_of_day >= 11 AND hour_of_day < 18)
|
||
OR (hour_of_day >= 21 AND hour_of_day < 22)
|
||
THEN charge_amount ELSE 0
|
||
END), 2) AS flat_charging_amount,
|
||
|
||
-- 谷时段:22:00-次日8:00(跨天处理)
|
||
ROUND(SUM(CASE
|
||
WHEN hour_of_day >= 22 OR hour_of_day < 8
|
||
THEN charge_amount ELSE 0
|
||
END), 2) AS valley_charging_amount,
|
||
|
||
-- 总量
|
||
ROUND(SUM(charge_amount), 2) as total_charging_amount
|
||
FROM charge_data
|
||
GROUP BY company_name
|
||
ORDER BY total_charging_amount DESC
|
||
LIMIT 10
|
||
#end
|
||
#end |