在TSQL中将最大/最小分数拆分为3个带固定阈值的带
考虑到最大/最小分数为90-22、100-55、85-41、93-30、40-18,我需要将它们分为3个等级,每个等级的阈值分别为80和60。所以第一对会给我(90-80,80-60,60-22),最后一对会给(null-80,null-60,40-18) 我用下面的SQL部分地解决了这个问题,我遇到的问题是边缘情况,例如,对于最后一对(40-18),大写的值返回为60。我知道如果最大/最小分数不低于80,我会遇到问题(例如93-85,因为这也会返回我不想要的琥珀色范围)在TSQL中将最大/最小分数拆分为3个带固定阈值的带,tsql,Tsql,考虑到最大/最小分数为90-22、100-55、85-41、93-30、40-18,我需要将它们分为3个等级,每个等级的阈值分别为80和60。所以第一对会给我(90-80,80-60,60-22),最后一对会给(null-80,null-60,40-18) 我用下面的SQL部分地解决了这个问题,我遇到的问题是边缘情况,例如,对于最后一对(40-18),大写的值返回为60。我知道如果最大/最小分数不低于80,我会遇到问题(例如93-85,因为这也会返回我不想要的琥珀色范围) DECLARE@Gre
DECLARE@GreenLower INT
声明@AmberUpper INT
声明@AmberLower INT
声明@RedUpper INT
设置为@GreenLower=80
设置为@AmberUpper=80
设置为@AmberLower=60
设置为@RedUpper=60
声明@Scores表
(
按VARCHAR分组(50),
PCTMax INT,
PCTAvg INT,
PCTMin INT,
ALLAvg INT,
AllMax INT,
奥尔明国际酒店
)
插入@Scores
值('Prov1',80,75,63,50,90,22)
插入@Scores
值('Prov2',100,96,70,80,100,55)
插入@Scores
值('Prov3',72,58,44,62,85,41)
插入@Scores
值('Prov4',90,78,58,59,93,30)
插入@Scores
值('Prov5',63,25,21,30,40,18)
选择GroupedBy,
PCTMax,
PCTAvg,
PCTMin,
阿拉夫,
当AllMax>79时,则AllMax ELSE NULL结束为绿色上限,
当AllMin>79时,则AllMin ELSE@GreenLower END为GreenLower,
当AllMax<79时,则AllMax ELSE
当AllMax>79时,则@AmberUpper ELSE NULL END
以AmberUpper结尾,
@作为一个军旅者,
当AllMin>59时,则在RedUpper结束时为NULL ELSE作为RedUpper,
当AllMin>59时为空,否则AllMin结束为红色
来自@Scores
最终,这些数据将更具动态性,并会产生真实的值,但目前我只是想让输出逻辑正确,这样我就可以将其插入到图形组件中,并生成如下所示的图形:
试试这个:
SELECT GroupedBy
, AllMax
, AllMin
, CASE WHEN AllMax > 79 THEN AllMax
ELSE NULL
END AS GreenUpper
, CASE WHEN AllMin > 79 THEN AllMin
ELSE @GreenLower
END AS GreenLower
, CASE WHEN AllMax BETWEEN 61 AND 80 THEN AllMax
WHEN AllMax > 79
AND AllMin < 80 THEN @AmberUpper
ELSE NULL
END AS AmberUpper
, @AmberLower AS AmberLower
, @RedUpper AS RedUpper
, CASE WHEN AllMin > 59 THEN NULL
ELSE AllMin
END AS RedLower
FROM @Scores
选择GroupedBy
,AllMax
,AllMin
,当AllMax>79时,则为AllMax
否则无效
以绿帮结束
,当AllMin>79时,则为AllMin
格林洛酒店
以格林洛结束
,当AllMax介于61和80之间时,则为AllMax
当AllMax>79时
所有最小值<80,然后@AmberUpper
否则无效
以琥珀色结尾
,@AmberLower作为AmberLower
,@RedUpper作为RedUpper
,当AllMin>59时为空
艾尔斯奥尔明
以红玫瑰结束
来自@Scores
以下工作分两步完成:
选择
分组方式:,
PCTMax,
PCTAvg,
PCTMin,
阿拉夫,
GreenUpper=最大值(当“绿色”时为案例BandName,然后为上端),
GreenLower=最大值(当“绿色”时为案例BandName,然后为低端),
AmberUpper=最大值(当“琥珀色”时,则为箱带名称,然后为上端),
AmberLower=最大值(当“琥珀色”时为箱带名称,然后为低端),
RedUpper=最大值(当“红色”时为案例带名称,然后为上限),
RedLower=最大值(当“红色”时为案例带名称,然后为下限)
从(
挑选
s、 分组方式:,
s、 PCTMax,
s、 PCTAvg,
s、 PCTMin,
s、 阿拉夫,
b、 乐队名称,
大写
当s.AllMax>=b.BandMin和s.AllMin s.AllMax时,则s.AllMax
b.班德马克斯酒店
结束
完,,
小写=大小写
当s.AllMax>=b.BandMin和s.AllMin感谢您提供示例数据!当给定范围与波段不匹配时,将上限
值显示为NULL,并将相应的下限
值显示为该波段的实际值有何意义?我之所以这样问,是因为我正在试图找出应该显示为Re的内容dLower
用于93-85
。是否应为0
?(如果范围未与频带相交,我可能会为上限
和下限
显示NULL
)当范围与波段不匹配时,显示空值和值没有实际意义,只是这样做更容易,并且当数据插入MS图表时,会在图形上产生正确的结果。RangeColumn图表需要最大值和最小值,如果其中一个值为空,则不会显示范围,因此如果结果为空-80,则不会显示green波段。如果你可以为上限和下限都设置NULL,那就太好了。差不多了,但是当我运行时,Prov5的RedUpper是60,但它应该是40。如果我将Prov4的值更改为76和65,那么我得到的范围是76-60(因此它不处理范围的下限),尽管当我设置93-82时,处理正常
SELECT GroupedBy
, AllMax
, AllMin
, CASE WHEN AllMax > 79 THEN AllMax
ELSE NULL
END AS GreenUpper
, CASE WHEN AllMin > 79 THEN AllMin
ELSE @GreenLower
END AS GreenLower
, CASE WHEN AllMax BETWEEN 61 AND 80 THEN AllMax
WHEN AllMax > 79
AND AllMin < 80 THEN @AmberUpper
ELSE NULL
END AS AmberUpper
, @AmberLower AS AmberLower
, @RedUpper AS RedUpper
, CASE WHEN AllMin > 59 THEN NULL
ELSE AllMin
END AS RedLower
FROM @Scores
SELECT
GroupedBy,
PCTMax,
PCTAvg,
PCTMin,
AllAvg,
GreenUpper = MAX(CASE BandName WHEN 'Green' THEN Upper END),
GreenLower = MAX(CASE BandName WHEN 'Green' THEN Lower END),
AmberUpper = MAX(CASE BandName WHEN 'Amber' THEN Upper END),
AmberLower = MAX(CASE BandName WHEN 'Amber' THEN Lower END),
RedUpper = MAX(CASE BandName WHEN 'Red' THEN Upper END),
RedLower = MAX(CASE BandName WHEN 'Red' THEN Lower END)
FROM (
SELECT
s.GroupedBy,
s.PCTMax,
s.PCTAvg,
s.PCTMin,
s.AllAvg,
b.BandName,
Upper = CASE
WHEN s.AllMax >= b.BandMin AND s.AllMin <= b.BandMax THEN
CASE
WHEN b.BandMax > s.AllMax THEN s.AllMax
ELSE b.BandMax
END
END,
Lower = CASE
WHEN s.AllMax >= b.BandMin AND s.AllMin <= b.BandMax THEN
CASE
WHEN b.BandMin < s.AllMin THEN s.AllMin
ELSE b.BandMin
END
END
FROM Scores s
CROSS JOIN (
SELECT 'Green', 80, 2147483647 UNION ALL
SELECT 'Amber', 60, 79 UNION ALL
SELECT 'Red' , 0, 59
) b (BandName, BandMin, BandMax)
) s
GROUP BY
GroupedBy,
PCTMax,
PCTAvg,
PCTMin,
AllAvg