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
Ist diese 'Data'-Tabelle zwei Spalten:' int MinValue' und 'int MaxValue'? Wenn jetzt, warum? –
Bitte, wer ist Ihre Datenstruktur, das ist Beispieldaten mit allen verfügbaren Spalten, und erwartete Ausgabe – scsimon
ja das ist Daten in Spalte mit Datentyp Float – Amelia