2016-09-29 6 views
-2

I Excelで列として2つの値を表示する必要が与えられたデータより大きい値と小さい値を得るためにSQL構文を書く方法は?

Range 
1000000+ 
2000000+ 
100001-250000 
10001-11000 
10001-12500 
1001-2000 
1001-2500 
11001-12000 
12001-13000 
12501-15000 
13001-14000 
14001-15000 
15001-16000 
15001-20000 
15001-25000 

以下のように、私は範囲がより大きい場合以下の条件で

場合をSQLテーブル列のデータを持っている - 6000次にとして(ID)をカウントGreater_Range

場合範囲未満である - 次いでLesser_Range

として(ID)をカウントIステートメントが、結果は私が手動で数える場合に比べてIDの正しいカウントを示していない場合をした6000。誰でも私にどこに間違っているとお考えですか?

+3

を比較し、この 'Data'-テーブルには、2つの列がありん:' MinValue'をint型と 'MaxValue'をint型?今なら、なぜ? –

+0

してくださいそれが可能なすべての列とサンプルデータが誰であるか、あなたのデータ構造、および予想される出力 – scsimon

+0

ティムが言うようにはい、これはあなたの問題はあなたが別の2をぎゅうぎゅう詰めているように見えることに起因する、データ型フロート – Amelia

答えて

0

私が正しく質問を理解している場合、あなたは基本的にサイズがあなたの範囲を分割CTEを作成できる大きさ未満6000

6000より大きいと同様である範囲の数のカウントを決定したいです文字列を最小値と最大値に変換します。次は

最後のステップはIsLessThan6000とIsGreaterThan6000列を合計する範囲の大きさが大きいか小さいより6000実際には、単純に0または1(IsLessThan6000とIsGreaterThan6000列)を返しているかどうかを判断するためにcase文を使用します。次の例では、方法を示しています。

DECLARE @TerribleRangeTable TABLE 
(
    [ID] INT IDENTITY PRIMARY KEY 
    ,[Range] NVARCHAR(100) 
) 

INSERT INTO @TerribleRangeTable 
(
    [Range] 
) 
VALUES 
     ('1000000+'), 
     ('2000000+'), 
     ('100001-250000'), 
     ('10001-11000'), 
     ('10001-12500'), 
     ('1001-2000'), 
     ('1001-2500'), 
     ('11001-12000'), 
     ('12001-13000'), 
     ('12501-15000'), 
     ('13001-14000'), 
     ('14001-15000'), 
     ('15001-16000'), 
     ('15001-20000'), 
     ('15001-25000') 


DECLARE @maxUnbound INT = 1073741824; 

WITH CTE_RangeMinMax 
AS 
( 
    SELECT [ID] 
      ,[Range] 
      ,( -- CASE statement 
       CASE  
        WHEN CHARINDEX('-', [Range]) = 0 THEN CAST(REPLACE([Range], '+', '') AS FLOAT) -- If no ‘-‘ character is available then assume this is an unbound range on maximum. Simply replace ‘+’ character with an empty string and convert to float. 
        WHEN CHARINDEX('-', [Range]) > 0 THEN LEFT([Range], CHARINDEX('-', [Range]) - 1) -- Get the text left of ‘-‘character to get range minimum and convert to float. 
        ELSE NULL 
       END 
      ) RangeMin 
      ,(
       CASE  
        WHEN CHARINDEX('-', [Range]) = 0 THEN @maxUnbound -- If no ‘-‘ character is available then assume this is an unbound range on maximum. Set value to a large integer. 
        WHEN CHARINDEX('-', [Range]) > 0 THEN RIGHT([Range], LEN([Range]) - CHARINDEX('-', [Range])) -- -- Get the text right of ‘-‘character to get range maximum and convert to float. 
        ELSE NULL 
       END 
      ) RangeMax 
    FROM @TerribleRangeTable 
), CTE_RangeGreaterOrLessThan 
AS 
(
    SELECT [ID] 
      ,[Range] 
      ,RangeMin 
      ,RangeMax 
      ,(
       CASE 
        WHEN (RangeMax - RangeMin) <= 6000 THEN 1 
        ELSE 0 
       END 
      ) AS IsLessThan6000 
      ,(
       CASE 
        WHEN (RangeMax - RangeMin) > 6000 THEN 1 
        ELSE 0 
       END 
      ) AS IsGreaterThan6000 

    FROM CTE_RangeMinMax 
) 
SELECT SUM(IsLessThan6000) AS Lesser_RangeCount 
     ,SUM(IsGreaterThan6000) AS Greater_RangeCount 
FROM CTE_RangeGreaterOrLessThan 
+0

ご協力ありがとうございます。私は一時テーブルと文字列関数を使用し、正しい答えを得た。私はCTEとJamieD77ソリューションでもあなたのソリューションを好むでしょう。再度、感謝します!! – Amelia

0
SELECT COUNT(CASE WHEN [Range] > 6000 THEN 1 END) AS Above6000, 
     COUNT(CASE WHEN [Range] < 6000 THEN 1 END) AS Below6000 

FROM ( 
    SELECT 
     CASE WHEN PATINDEX('%+%', [Range]) > 0 THEN LEFT([Range], PATINDEX('%+%', [Range]) - 1) 
      WHEN PATINDEX('%-%', [Range]) > 0 THEN STUFF([Range],1, PATINDEX('%-%', [Range]),'') 
     END [Range] 
    FROM MyTable 

) t 

が最大値を取得し、

+0

ありがとう!! JamieD77。私はあなたのソリューションも好むでしょう。 – Amelia

関連する問題