SQL实现按经销商统计各品牌可售状态及停售天数的需求
解决汽车经销商指定品牌状态统计的SQL方案
核心思路
- 先获取全量经销商列表,确保覆盖从未售卖目标品牌的经销商;
- 针对指定品牌,筛选经销商的对应记录,优先识别当前可售状态,若无可售则提取最近的售卖结束日期;
- 通过条件判断输出符合要求的状态值:可售显示0、不可售计算天数差、无记录显示NULL。
SQL实现示例(以MySQL为例)
-- 替换'Toyota'为你需要统计的目标品牌,可售标记'Y'请根据实际数据调整 WITH dealer_list AS ( -- 获取所有唯一经销商ID,若有单独的经销商维度表可直接用该表 SELECT DISTINCT dealership_ID FROM dealership_cars ), target_brand_records AS ( SELECT dealership_ID, -- 标记当前是否可售 MAX(CASE WHEN `Available?` = 'Y' THEN 1 ELSE 0 END) AS is_available, -- 获取最近一次售卖结束的日期 MAX(sold_date) AS last_sold_date FROM dealership_cars WHERE make = 'Toyota' GROUP BY dealership_ID ) SELECT dl.dealership_ID, CASE WHEN tbr.is_available = 1 THEN 0 WHEN tbr.last_sold_date IS NOT NULL THEN DATEDIFF(CURDATE(), tbr.last_sold_date) ELSE NULL END AS target_brand_status FROM dealer_list dl LEFT JOIN target_brand_records tbr ON dl.dealership_ID = tbr.dealership_ID -- 可选:筛选特定经销商,比如示例中的612 WHERE dl.dealership_ID = 612;
关键细节说明
- 若使用其他数据库,需调整日期计算函数:
- PostgreSQL:用
CURRENT_DATE替换CURDATE(),天数差用DATE_PART('day', CURRENT_DATE - last_sold_date) - SQL Server:用
GETDATE()替换CURDATE(),天数差用DATEDIFF(day, last_sold_date, GETDATE()) - Oracle:用
SYSDATE替换CURDATE(),天数差用TRUNC(SYSDATE) - TRUNC(last_sold_date)
- PostgreSQL:用
Available?的取值(如'Yes'/'No'或布尔值)需与实际数据匹配,对应修改CASE判断条件;- 若存在从未有任何车辆记录的经销商,必须关联单独的经销商维度表,否则会遗漏这类经销商。
内容的提问来源于stack exchange,提问作者dom_2108
相关产品推荐
相关产品推荐

