SQL逻辑问题

查询结果显示6个月份数据(1-6)(7-12),当前时间下如果查不到数据则显示上个期间数据,例如我传时间2024-5,显示的应该是2024年1-6月数据,如果没有这个区间数据则取2023年7月-12月的数据,SQL如下,怎么调整呐:

WITH RESULT AS(SELECT 

GSMC

,GSDM

,SUM(CASE WHEN LEFT(NY,4)='${year}' THEN TO NUMBER(DOYZ) END) YZP ,SUM (CASE WHEN LEFT(NY,4) = 'Ş{year-1}' THEN TO NUMBER(DQYZ) END ) YZL ,SUM(CASE WHEN LEFT(NY,4)='Ş{year-2}' THEN TO NUMBER(DQYZ) END ) YZQ FROM Z CD HOZHUOYUE.DM FINE ASSET VALUES NOT USING SAP WHERE LEFT(NY,4) IN ('Ş{year}','${year-1}','${year-2}')

AND RIGHT (NY,2)='${month end}'

GROUP BY GSMC,GSDM

UNION ALL

SELECT

'公司整体'GSMC

,'1000' GSDM

,SUM(CASE WHEN LEFT(NY,4)= '${year}' THEN TO NUMBER(DQYZ) END ) YZP ,SUM(CASE WHEN LEFT(NY,4)='${year-1)' THEN TO NUMBER(DQYZ) END ) YZL ,SUM(CASE WHEN LEFT(NY,4)='Ş{year-2}' THEN TO_NUMBER(DQYZ) END) YZQ FROM Z CD HOZHUOYUE.DM FINE ASSET VALUES NOT USING SAP

WHERE LEFT(NY,4) IN ('Ş{year}','Ş{year-1}','${year-2}')

AND RIGHT(NY,2) = '${month end}'

SELECT R.*

,CASE WHEN YZL = 0 OR YZL IS NULL OR YZP IS NULL THEN 0 ELSE YZP/YZL-1 END TB

FROM RESULT R

ORDER BY CASE WHEN GSMC=THEN 9999999999999

SQL 四三九六 发布于 2024-7-4 20:52
1min目标场景问卷 立即参与
回答问题
悬赏:3 F币 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共3回答
最佳回答
0
JL98Lv6中级互助
发布于2024-7-12 10:03(编辑于 2024-7-12 10:12)

以SQLSERVER 数据库为例:

WITH T1 AS

 (SELECT 

'2024-06-12' AS SJ , 123 AS SL  

UNION ALL 

SELECT '2024-04-12' AS SJ , 123 AS SL  

UNION ALL 

SELECT '2023-12-12' AS SJ , 123 AS SL  

UNION ALL 

SELECT '2023-05-12' AS SJ , 123 AS SL 

 )

,T2 AS (

SELECT 

CASE WHEN MONTH(SJ) <=6 THEN  CONCAT(YEAR(SJ),'1') ELSE  CONCAT(YEAR(SJ),'2')  END  FZ, 

DENSE_RANK() OVER ( ORDER BY  (CASE WHEN MONTH(SJ) <=6 THEN  CONCAT(YEAR(SJ),'1') ELSE  CONCAT(YEAR(SJ),'2')  END) DESC) AS RowNum,

 SJ, 

SL 

FROM 

T1

WHERE  (CASE WHEN MONTH(SJ) <=6 THEN  CONCAT(YEAR(SJ),'1') ELSE  CONCAT(YEAR(SJ),'2')  END) 

<=

(CASE WHEN RIGHT('2024-05',2)*1  < 6 THEN CONCAT(LEFT('2024-05', 4),'1') ELSE CONCAT(LEFT('2024-05', 4),'2') END )

)

SELECT * FROM  T2 WHERE RowNum = 1

思路:

1、先对年月处理,数据月份小于等于6的归于1,其他归于2,用年份拼接之后形成分组字段

CASE WHEN MONTH(SJ) <=6 THEN  CONCAT(YEAR(SJ),'1') ELSE  CONCAT(YEAR(SJ),'2')  END  FZ,

2、对分组形成的数据进行排序(相同排序字段序号相同) 

DENSE_RANK() OVER ( ORDER BY  (CASE WHEN MONTH(SJ) <=6 THEN  CONCAT(YEAR(SJ),'1') ELSE  CONCAT(YEAR(SJ),'2')  END) DESC) AS RowNum,

3、对过滤参数处理,处理成和分组相同的格式,用<=过滤

(CASE WHEN RIGHT('2024-05',2)*1  < 6 THEN CONCAT(LEFT('2024-05', 4),'1') ELSE CONCAT(LEFT('2024-05', 4),'2') END )

4、选择序号为1的数据

SELECT * FROM  T2 WHERE RowNum = 1

最佳回答
0
Z4u3z1Lv6专家互助
发布于2024-7-5 08:24

如果上一个周期(半年)也没有呢

  • 四三九六 四三九六(提问者) 在往前推一个周期
    2024-07-05 08:42 
  • Z4u3z1 Z4u3z1 回复 四三九六(提问者) 那就只有用存储过程来做
    2024-07-05 08:44 
  • 四三九六 四三九六(提问者) 写个MAX(CASE WEHN )可以达成吗
    2024-07-05 09:01 
  • Z4u3z1 Z4u3z1 回复 四三九六(提问者) 想了有点绕。要绕晕...............
    2024-07-05 09:05 
最佳回答
0
梦似幻亦真Lv3见习互助
发布于2024-7-11 18:13

思路:

1、先通过传入的时间获取小于等于传入时间的数据的最大日期值

2、然后通过SQL自带的函数处理出来开始时间和结束时间

3、通过时间圈定范围查询出数据

  • 3关注人数
  • 364浏览人数
  • 最后回答于:2024-7-12 10:12
    请选择关闭问题的原因
    确定 取消
    返回顶部