2016-09-29 3 views
-2

Ich habe ein Datum in SQL-Tabelle Spalt wie untenWie schreibe ich SQL-Syntax zu erhalten größer als und kleiner als Werte aus bestimmten Daten?

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 

ich zwei Werte als Spalten in Excel mit unter Bedingungen

Fall zeigen muß, wenn die Reichweite größer ist als - 6000 dann (ID) gelten als Greater_Range

Fall, wenn die Reichweite kleiner als - 6000 dann zählen dann (ID) als Lesser_Range

I Fall Aussage tat aber Ergebnis zeigt nicht korrekte Zählung der ID im Vergleich zu, wenn ich manuell zählen. bitte kann mir jemand vorschlagen, wo es falsch ist?

+3

Ist diese 'Data'-Tabelle zwei Spalten:' int MinValue' und 'int MaxValue'? Wenn jetzt, warum? –

+0

Bitte, wer ist Ihre Datenstruktur, das ist Beispieldaten mit allen verfügbaren Spalten, und erwartete Ausgabe – scsimon

+0

ja das ist Daten in Spalte mit Datentyp Float – Amelia

Antwort

0

Wenn ich die Frage richtig verstanden habe, wollen Sie im Wesentlichen eine Zählung für die Anzahl der Bereiche bestimmen, die Größe größer als 6000 und in ähnlicher Weise die Größe kleiner als 6000.

Sie können einen CTE erstellen, die den Bereich spaltet string in ein Minimum und Maximum Werte. Als Nächstes verwenden Sie eine case-Anweisung, um festzustellen, ob die Größe des Bereichs tatsächlich größer oder kleiner als 6000 ist und einfach eine 0 oder 1 zurückgibt (IsLessThan6000 und IsGreaterThan6000)

Endgültiger Schritt ist die Summe der Spalten IsLessThan6000 und IsGreaterThan6000. Das folgende Beispiel zeigt, wie:

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

Danke für Ihre Hilfe. Ich habe die temporäre Tabellen- und Zeichenfolgenfunktion verwendet und die Antwort richtig gelesen. Ich werde Ihre Lösung auch mit CTE und JamieD77 Lösung bevorzugen. Danke noch einmal!! – 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 

den maximalen Wert erhalten und vergleichen

+0

Danke !! JamieD77. Ich werde Ihre Lösung auch bevorzugen. – Amelia

Verwandte Themen