Sql Query Output与另一个表连接

时间:2013-09-18 22:41:56

标签: sql sql-server sql-server-2008 tsql sql-server-2008-r2

我有一个查询,它给出了以下输出:

select 
                PD.ProductId, TotalCalls = COUNT(DISTINCT PD.LogId), 
                TrueCalls = COUNT(DISTINCT case when PD.ExceptionCode  = ' ' then PD.LogId  END),
                ErrorCalls =COUNT(DISTINCT case when PD.ExceptionCode  != ' ' then PD.LogId  END),
                PassPercentage = CONVERT(DECIMAL(10,1),100 - (CAST(COUNT(DISTINCT case when PD.ExceptionCode  != ' ' then PD.LogId  END) as float)/CAST(COUNT(PD.LogId) as float)*100))
         from 
                Log P 
                INNER JOIN LogProduct PD ON P.LogId = PD.LogId


        WHERE   
                (ResponseTime < '2013-09-28' and  RequestTime > '2013-09-01')

    Group By 
                PD.ProductId

它给了我以下输出:

ProductId   TotalCalls  TrueCalls   ErrorCalls  PassPercentage
1   6   6   0   100.0
2   1   0   1   85.7
3   33  15  18  92.2

现在我有另一张表:

级别:

LevelId Min Max Bool    ProductId
1   100 100 0   2
2   80  99  0   2
3   60  79  0   2
4   40  59  0   2
5   1   39  1   2
6   0   0   0   2
7   -1  -1  0   2
1   100 100 0   1
2   80  99  0   1
3   60  79  1   1
4   40  59  0   1
5   1   39  0   1
6   0   0   0   1
7   -1  -1  0   1

我想要做的是比较第一个查询的输出并添加一个新的LevelId列:

示例:

我正在寻找这样的输出:

ProductId   TotalCalls  TrueCalls   ErrorCalls  PassPercentage  LevelId
1   6   6   0   100.0       1
2   1   0   1   85.7         2

这里的逻辑是:我想比较该特定产品的每一行的PassPercentage,并找出它属于哪个级别。

在上面的示例中:产品2的PassPercentage为85.7。如果您检查上面的Levels表中的ProductId 2, 等级2应选择为80&lt; 87.5&lt; 99

我无法弄明白我怎么能这样做.. 请让我知道我是如何从这里前进的......还是让我了解我应该做些什么?

1 个答案:

答案 0 :(得分:1)

查询看起来像

with stats as (
select 
                PD.ProductId, TotalCalls = COUNT(DISTINCT PD.LogId), 
                TrueCalls = COUNT(DISTINCT case when PD.ExceptionCode  = ' ' then PD.LogId  END),
                ErrorCalls =COUNT(DISTINCT case when PD.ExceptionCode  != ' ' then PD.LogId  END),
                PassPercentage = CONVERT(DECIMAL(10,1),100 - (CAST(COUNT(DISTINCT case when PD.ExceptionCode  != ' ' then PD.LogId  END) as float)/CAST(COUNT(PD.LogId) as float)*100))
         from 
                Log P 
                INNER JOIN LogProduct PD ON P.LogId = PD.LogId


        WHERE   
                (ResponseTime < '2013-09-28' and  RequestTime > '2013-09-01')

    Group By 
                PD.ProductId
)
select s.*, l.LevelId
  from stats s
  join levels l on l.ProductId = s.ProductId and s.PassPercentage between l.Min and l.Max