Wie andere erwähnt haben. Am besten wäre es, das Tischdesign zu korrigieren. Natürlich leben wir alle in der realen Welt und diese Bucht ist nicht immer möglich.
Im Folgenden wird die Idee einer "Semi-Perminant" -Tabelle in Tempdb verwendet. Dies wird mit neuen Messungen aktualisiert, ohne dass die zugrunde liegende Tabelle bei jeder Ausführung erneut verarbeitet werden muss. Dies sollte die schnellstmöglichen Ausführungszeiten bei einer vollständigen Neugestaltung der Tabelle & Prozess Redesign ergeben.
IF OBJECT_ID('tempdb..#TestData', 'U') IS NOT NULL
DROP TABLE #TestData;
CREATE TABLE #TestData (
Measured INT NOT NULL PRIMARY KEY CLUSTERED,
Decile_3 VARCHAR(15) NOT NULL,
Decile_4 VARCHAR(15) NOT NULL,
Decile_5 VARCHAR(15) NOT NULL,
Decile_6 VARCHAR(15) NOT NULL,
Decile_7 VARCHAR(15) NOT NULL,
Decile_8 VARCHAR(15) NOT NULL,
Decile_9 VARCHAR(15) NOT NULL,
Decile_10 VARCHAR(15) NOT NULL
);
INSERT #TestData (Measured, Decile_3, Decile_4, Decile_5, Decile_6, Decile_7, Decile_8, Decile_9, Decile_10) VALUES
(1, '54.67 - 35.91', '35.90 - 25.63', '25.62 - 19.34', '19.33 - 14.15', '14.14 - 9.10', ' 9.09 - 3.34', ' 3.33 - 0.01', '0'),
(2, '53.85 - 64.74', '64.75 - 70.90', '70.91 - 86.68', '89.32 - 92.92', '92.91 - 96.54', '96.55 - 98.67', '96.55 - 98.67', '>= 98.68'),
(3, '11.22 - 18.57', '18.58 - 24.99', '25.00 - 31.84', '31.85 - 38.92', '38.93 - 47.86', '47.87 - 59.99', '60.00 - 79.01', '>= 79.01'),
(4, '14.13 - 23.25', '23.26 - 33.02', '33.03 - 43.58', '43.59 - 53.96', '53.97 - 63.60', '63.61 - 74.54', '74.55 - 85.52', '>= 85.53'),
(5, '12.41 - 22.21', '22.22 - 32.30', '32.31 - 40.86', '40.87 - 47.91', '47.92 - 55.25', '55.26 - 63.06', '63.07 - 73.22', '>= 73.23');
-- SELECT * FROM #TestData td'
--======================================================================
--======================================================================
-- create a semi-perminant unpivot table in temp db that simply adds new measurement as opposed to
-- reporcessing the entire base table with every execution.
IF OBJECT_ID('tempdb.dbo.UnpivotData', 'U') IS NULL
BEGIN -- DROP TABLE tempdb.dbo.UnpivotData;
CREATE TABLE tempdb.dbo.UnpivotData (
Measured INT NOT NULL,
dType TINYINT NOT NULL,
BegRange DECIMAL(9,2) NOT NULL,
EndRange DECIMAL(9,2) NOT NULL,
PRIMARY KEY CLUSTERED (Measured, dType)
);
END;
INSERT tempdb.dbo.UnpivotData (Measured, dType, BegRange, EndRange)
SELECT
td.Measured,
d.dType,
r.BegRange,
r.EndRange
FROM
#TestData td
CROSS APPLY (VALUES (3, td.Decile_3), (4, td.Decile_4), (5, td.Decile_5), (6, td.Decile_6),
(7, td.Decile_7), (8, td.Decile_8), (9, td.Decile_9), (10, td.Decile_10)
) d (dType, dValue)
CROSS APPLY (VALUES (
CASE
WHEN CHARINDEX(' - ', d.dValue) > 0 THEN LEFT(d.dValue, 5)
WHEN LEFT(d.dValue, 2) = '>=' THEN RIGHT(d.dValue, 5)
WHEN LEFT(d.dValue, 2) = '<=' THEN '0'
ELSE d.dValue
END,
CASE
WHEN CHARINDEX(' - ', d.dValue) > 0 THEN RIGHT(d.dValue, 5)
WHEN LEFT(d.dValue, 2) = '>=' THEN '9999999.99'
WHEN LEFT(d.dValue, 2) = '<=' THEN RIGHT(d.dValue, 5)
ELSE d.dValue
END
)) r (BegRange, EndRange)
WHERE
NOT EXISTS (SELECT * FROM tempdb.dbo.UnpivotData ud WHERE td.Measured = ud.Measured);
-----------------------------------------------------------
-- Querieng from the temp table is now quite easy.
DECLARE
@Measure INT = 4,
@PerformanceVal DECIMAL(9,2) = 85.54;
SELECT
ud.Measured,
ud.dType,
ud.BegRange,
ud.EndRange
FROM
tempdb.dbo.UnpivotData ud
WHERE
ud.Measured = @Measure
AND @PerformanceVal BETWEEN ud.BegRange AND ud.EndRange;
Ergebnisse ...
Measured dType BegRange EndRange
----------- ----- --------------------------------------- ---------------------------------------
4 10 85.53 9999999.99
Der letzte Fall, den Sie gepostet haben - soll es 7.2 zurückgeben? Oder sollte das nur 7 lesen? Ist das Bild Ihr aktuelles Datenformat? – Eli
Ich schlage vor, dass Sie Ihre Tabelle normalisieren, um atomare Werte in jeder Spalte zu speichern und die sich wiederholende Gruppe zu vermeiden. Es wird dann einfacher sein, einfache Abfragen durchzuführen und auch bessere Ergebnisse zu erzielen. –
Bitte lesen Sie http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-when-asking-a-question/285557 und die angenommene Antwort –