有关SQL查询的建议

时间:2019-04-26 19:31:25

标签: sql sql-server

我需要对现有的查询进行帮助,然后对其进行扩展。查询是:

,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

enter image description here

1 个答案:

答案 0 :(得分:0)

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

我一直试图做的就是合并查询,以便减少数据集的数量。解决我的问题的方法如下:

SELECT DISTINCT

(从DATEADD(YEAR,DATEDIFF(YEAR,0,DATEADD(YEAR,-1,@STARTDATE)),0)和DATEADD(Year,-1,@ STARTDATE)之间的事务WHERE EventDate中选择COUNT(DISTINCT EventId) AND区域IN(@Region)A,

(从DATEADD(YEAR,DATEDIFF(YEAR,0,DATEADD(YEAR,-0,@STARTDATE)),0)和DATEADD(Year,-0,@ STARTDATE)之间的事务WHERE EventDate中选择COUNT(DISTINCT EventId)个AND Region IN(@Region)B

FROM交易

这不包含我需要的所有子查询,但应该向您显示我要去的地方。