首页 > 解决方案 > 请求关于 SQL 查询的建议

问题描述

我需要获取一个我收到帮助的现有查询并对其进行扩展。查询是:

,COUNT (DISTINCT 
  (CASE 
    WHEN EventDate between DATEADD(day, -56, @STARTDATE) AND DATEADD(day, -29, @STARTDATE) THEN EventId 
  END)
) PrevMonth

我现在需要对此进行扩展以添加一些条件。这些条件的一些解释如下:

对于每个 EventId(客户遇到),我们都有一个复杂度等级(数值)。每个 EventId 将有多个行,涵盖遭遇合同的生命周期。

修改现有条件以返回不同的 EventId 计数,其中为该 EventId 返回最低复杂度值。

因此,对于指定的日期范围,按 EventId 分组,我需要能够根据最低复杂度计数获得计数。这应该让我知道 EventId(客户遇到)的方式,其中最低复杂度级别是特定值。

我知道我可以使用 MIN 函数从单个 EventId 下的所有遭遇中返回最小值。

我只是对如何将这些放在一起以获得我想要的答案感到困惑。建议将不胜感激。

完整的查询是:

Declare @temp table(YTD_Previous float, YTD_Current float, TwentyEightDays float, FiftySixDays float)

insert into @temp

SELECT
 COUNT (DISTINCT (CASE when EventDate between DATEADD(YEAR, DATEDIFF(YEAR, 0,DATEADD(YEAR,-1, @STARTDATE)), 0) and DATEADD(Year,-1,@STARTDATE) then EventId END)) YTD_Previous
,COUNT (DISTINCT (CASE when EventDate between DATEADD(YEAR, DATEDIFF(YEAR, 0,DATEADD(YEAR,-0, @STARTDATE)), 0)and DATEADD(Year,-0,@STARTDATE) then EventId END)) YTD_Current
,COUNT (DISTINCT (CASE when EventDate between DATEADD(YEAR,-0,DATEADD(DAY, DATEDIFF(DAY, 0, @STARTDATE), -28)) and DATEADD(Year,-0,@STARTDATE) then EventId END)) TwentyEightDays
,COUNT (DISTINCT (CASE WHEN EventDate between DATEADD(day, -56, @STARTDATE) AND DATEADD(day, -29, @STARTDATE) THEN EventId END)) FiftySixDays

FROM Transaction

WHERE Region IN (@Region)

SELECT 
     YTD_Current
    , YTD_Previous
    , case when (YTD_Previous - YTD_Current) = 0 then 0 when YTD_Previous = 0 then YTD_Current else (YTD_Current - YTD_Previous) / YTD_Previous end YTD_Chg        
        , TwentyEightDays
        , FiftySixDays
        , Case when (FiftySixDays - TwentyEightDays) = 0 then 0 when FiftySixDays = 0 then TwentyEightDays else (TwentyEightDays - FiftySixDays) / FiftySixDays end WEEK_Chg 

FROM @temp

在此处输入图像描述

标签: sqlsql-server

解决方案


我花了一些时间对这个问题进行了一些额外的研究。我的问题之一是我没有接受过这方面的任何培训,因此,术语对我来说是一个严重的弱点。

我一直在尝试做的是整合查询,以便我可以减少数据集的数量。我的问题的解决方案如下:

选择不同的

(SELECT COUNT(DISTINCT EventId) FROM Transaction WHERE EventDate between DATEADD(YEAR, DATEDIFF(YEAR, 0,DATEADD(YEAR,-1, @STARTDATE)), 0) AND DATEADD(Year,-1,@STARTDATE) AND Region IN (@Region))一个,

(SELECT COUNT(DISTINCT EventId) FROM Transaction WHERE EventDate between DATEADD(YEAR, DATEDIFF(YEAR, 0,DATEADD(YEAR,-0, @STARTDATE)), 0) AND DATEADD(Year,-0,@STARTDATE) AND Region IN (@Region)) B

从交易

这不包含我需要的所有子查询,但应该告诉你我要去哪里。


推荐阅读