我有一个查询,它给出了以下输出:
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
我无法弄明白我怎么能这样做.. 请让我知道我是如何从这里前进的......还是让我了解我应该做些什么?
答案 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