4

最大/最小スコアが 90 ~ 22、100 ~ 55、85 ~ 41、93 ~ 30、40 ~ 18 の場合、これらを 80 と 60 のしきい値でそれぞれ 3 つのバンドに分割する必要があります。私 (90-80、80-60、60-22)、最後のペアは (null-80、null-60、40-18) になります。

私はこれを以下の SQL で部分的に動作させています。私が抱えている問題は、たとえば最後のペア (40-18) の場合、UpperRed 値が 60 として返されるなど、エッジケースにあります。最大/最小スコアが 80 を下回ることはありません (たとえば、93 ~ 85 です。これは、望ましくない琥珀色の範囲も返すためです)。

DECLARE @GreenLower INT
DECLARE @AmberUpper INT
DECLARE @AmberLower INT
DECLARE @RedUpper INT

SET @GreenLower = 80
SET @AmberUpper = 80
SET @AmberLower = 60
SET @RedUpper = 60

DECLARE @Scores TABLE
  (
   GroupedBy VARCHAR(50) ,
   PCTMax INT ,
   PCTAvg INT ,
   PCTMin INT ,
   ALLAvg INT ,
   AllMax INT ,
   AllMin INT
  )

INSERT  INTO @Scores
VALUES  ( 'Prov1', 80, 75, 63, 50, 90, 22 )
INSERT  INTO @Scores
VALUES  ( 'Prov2', 100, 96, 70, 80, 100, 55 )
INSERT  INTO @Scores
VALUES  ( 'Prov3', 72, 58, 44, 62, 85, 41 )
INSERT  INTO @Scores
VALUES  ( 'Prov4', 90, 78, 58, 59, 93, 30 )
INSERT  INTO @Scores
VALUES  ( 'Prov5', 63, 25, 21, 30, 40, 18 )

SELECT  GroupedBy ,
            PCTMax ,
    PCTAvg ,
    PCTMin ,
    AllAvg ,
    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 < 79 THEN AllMax ELSE 
        CASE WHEN AllMax > 79 THEN @AmberUpper ELSE  NULL END 
    END AS AmberUpper ,
    @AmberLower AS AmberLower ,

    CASE WHEN AllMin > 59 THEN NULL ELSE @RedUpper END AS RedUpper ,
    CASE WHEN AllMin > 59 THEN NULL ELSE AllMin END AS RedLower

FROM    @Scores

最終的には、このデータはより動的になり、実際の値を引き出しますが、今のところ、出力ロジックを正しく取得して、グラフ コンポーネントにプラグインし、次のようなグラフを生成できるようにしています。 ひげチャート

4

2 に答える 2

1

以下は、2 つのステップでジョブを実行します。

  1. サブ範囲ごとに 1 つの行で、すべての範囲を上限値と下限値の行に分割します。

  2. サブ範囲のピボットを解除して、それらのすべてのグループを同じ行に表示します。

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

subselect は最初のステップを実装し、補助インライン テーブルを使用して範囲を分割します。外側の選択では、グループ化を使用して、取得した値のペアのピボットを解除します。

SQL Fiddleでこのソリューションを試すことができます。ここでScoresは、分割をよりわかりやすくするために、テーブルにエッジ ケースを追加しました。

于 2012-06-23T09:36:14.687 に答える
0

これを試して:

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 
于 2012-06-22T15:51:00.010 に答える