Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在TSQL中将最大/最小分数拆分为3个带固定阈值的带_Tsql - Fatal编程技术网

在TSQL中将最大/最小分数拆分为3个带固定阈值的带

在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

考虑到最大/最小分数为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@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