2012-03-25 12 views
1

Table1Wie den Bereich zwischen zwei Reihen

ID Value 

001 100 
002 125 
003 150 
004 175 
005 200 
006 225 
... 

Erwartete Ausgabe

  • erhalten, wenn der Benutzer einen Wert zwischen 100 bis 124 eintritt, dann sollten id der Benutzer 001
  • Wenn anzuzeigen gibt einen Wert zwischen 125 und 149 ein, dann sollte ID 002 anzeigen

  • Wenn der Benutzer einen Wert zwischen 200 und 224 eingibt, dann ID sho ULD-Display 005

  • Wenn der Benutzer einen Wert zwischen 225 bis 249 eintritt, dann sollte ID angezeigt werden 006

Wie eine Abfrage für die oben genannte Bedingung zu machen.

Need Abfrage Hilfe

+0

kann die ID-ständig geführt werden der Ordnung? Könnte in der Zukunft etwas passieren, wo Zeile 7 einen Wert von 75 hat? – MatBailie

Antwort

2

Hier gehen Sie:

zuerst die Testtabelle erstellen:

CREATE TABLE #Temp(ID INT, Val INT) 
INSERT INTO #Temp VALUES(1, 100); 
INSERT INTO #Temp VALUES(2, 125); 
INSERT INTO #Temp VALUES(3, 150); 
INSERT INTO #Temp VALUES(4, 175); 
INSERT INTO #Temp VALUES(5, 200); 
INSERT INTO #Temp VALUES(6, 225); 

den Testwert

einrichten
DECLARE @value INT 
SET @value = 125 

Wenn ID sequenzielle (d 1, 2, 3, 4, 5, etc.)

SELECT t1.id 
FROM #Temp t1, #Temp t2 
WHERE t1.ID = t2.ID -1 
AND @value BETWEEN t1.Val AND t2.Val -1 

Wenn ID nicht sequentiell (dh 1, 2, 5, 7, 8, etc)

;WITH cte AS (SELECT ROW_NUMBER() OVER (ORDER BY id) AS rownum, ID, Val FROM #Temp) 
SELECT t1.id 
FROM cte t1, cte t2 
WHERE t1.rownum = t2.rownum -1 
AND @value BETWEEN t1.Val AND t2.Val -1 
3

Es wäre einfacher Abfrage transformierte Tabelle zu schreiben wie ID, anfangswert, endwert.

Für diese Tabelle:

SELECT MAX(ID) 
FROM Table1 
WHERE Value <= @value 

Grundsätzlich, wenn 155 eingegeben ist, IDs 1 2 und 3 zurückgebracht werden, dann MAX ID genommen wird (3), ist die Antwort.

+1

Ich stimme dem SQL zu, vorausgesetzt, die Werte sind immer in Ordnung. Aber ich stimme dem ersten Satz überhaupt nicht zu. Mit einem Index für "Wert, ID" in der aktuellen Tabelle erhalten Sie die bestmögliche Leistung; mit der gleichen Bestellannahme. – MatBailie

0

Use Case in SELECT-Anweisung ....

ZB:

declare @c int; 
set @c=120; 
SELECT 
    CASE 
    WHEN @c BETWEEN 100 AND 124 THEN '001' 
    WHEN @c BETWEEN 125 AND 149 THEN '002' 
    ELSE 'Other' 
END 
+1

Diese Antwort verwendet die Datenbanktabelle nicht. Schlägst du vor, den Code jedes Mal zu ändern, wenn sich die Werte in der Tabelle ändern? – MatBailie

2

die größte Übereinstimmung Holen und nach Wert Sortier erste Zeile zuvor zurück:

select top 1 id 
from range 
where value <= @value 
order by value desc 

Oder, wenn Sie müssen diese Abfrage in eine andere integrieren:

select id 
    from range 
where value = (select max(value) from range where value <= @value) 
+0

+1: Gibt dem OP das gewünschte Ergebnis und geht nicht davon aus, dass die IDs immer in Ordnung sind. – MatBailie

Verwandte Themen