2016-11-24 1 views
0

mit habe ich eine Tabelle delay mit Daten wie dieseHäufigkeitsverteilung Erstellen von T-SQL-Abfrage

Delay 
----- 
-15 
139 
81 
-3 
-17 
159 
8 
-128 
169 
-28 
98 
-62 
-51 
261 
-172 
217 
65 
-91 
-22 
170 
50 
5 
213 
60 
-23 
27 
-45 
-23 
389 
244 
-82 
11 
92 
30 
-42 
-34 
-151 
150 
-57 
-148 
313 
-36 
1 
50 
2 
-111 
-63 

und ich möchte eine Tabelle so etwas wie dies unter Verwendung einer Abfrage

Range   Values Frequency 
------------------------------------ 
On time    0  407 
Late < 1 min  60  159 
Late by 1-2 min 120  80 
Late by 2-3 min 180  71 
Late by 3-4 min 240  35 
Late by 4-5 min 300  19 
Late by 5-6 min 360   8 
Late by 6-7 min 420   9 
Late by 7-8 min 480   4 
Late >8 minutes  14 

ich gesucht erstellen das gegebene Problem. Aber es gibt Antworten, die sich auf die Zählung ähnlicher Werte in der Tabelle beziehen, aber keine von ihnen kategorisiert die Daten.

Bitte helfen

+0

Verzögerung ist in der zweiten? Was bedeutet negative Verzögerung? – Susilo

+0

Negativ ist für Personen, die früher als geplant zur Show kommen – Fan

+0

Was sind Werte? Die Summe aller Elemente in Reichweite? –

Antwort

0

SQL DEMO

with ranges as (
    SELECT 'On time' r UNION ALL 
    SELECT 'Late < 1 min' UNION ALL 
    SELECT 'Late by 1-2 min' UNION ALL 
    SELECT 'Late by 2-3 min' UNION ALL 
    SELECT 'Late by 3-4 min' UNION ALL 
    SELECT 'Late by 4-5 min' UNION ALL 
    SELECT 'Late by 5-6 min' UNION ALL 
    SELECT 'Late by 6-7 min' UNION ALL 
    SELECT 'Late by 7-8 min' UNION ALL 
    SELECT 'Late >8 minutes' 
), setup as ( 
    SELECT CASE WHEN [Delay] = 0 THEN 'On time' 
       WHEN [Delay] < 1 THEN 'Late < 1 min' 
       WHEN [Delay] < 2 THEN 'Late by 1-2 min' 
       WHEN [Delay] < 3 THEN 'Late by 2-3 min' 
       WHEN [Delay] < 4 THEN 'Late by 3-4 min' 
       WHEN [Delay] < 5 THEN 'Late by 4-5 min' 
       WHEN [Delay] < 6 THEN 'Late by 5-6 min' 
       WHEN [Delay] < 7 THEN 'Late by 6-7 min'    
       WHEN [Delay] < 8 THEN 'Late by 7-8 min'   
       ELSE 'Late >8 minutes' 
      END as [Range], 
      [Delay] 
    FROM Table1  
) 
SELECT t.r as Range, COALESCE(SUM(s.[Delay]),0) as Value, COUNT(s.[Delay]) as Freq 
FROM ranges t 
LEFT JOIN setup s 
    ON t.r = s.[Range] 
GROUP BY t.r 

OUTPUT

enter image description here

0

Dieses Problem gelöst werden kann CASE oder IIF verwenden, bu ti vorschlagen Code lesbarer Verwendung Funktion .. und skalierbar ..

Benutzerfunktion - ufRange

CREATE FUNCTION dbo.ufRange (@Delay INT) 
RETURNS INT 
AS 
BEGIN 
    DECLARE @Ret INT 
    IF @Delay <= 0 SET @Ret = 0   -- not late/ early 
    ELSE IF @Delay > 320 SET @Ret = 9 -- more than 8 minutes late 
    ELSE SET @Ret = @Delay/60   -- late <=1 to <=8 minutes 
    RETURN @Ret 
END 

Dann LateRange Ihre Detail range Unterstützung Tisch legen, so wie in Excel, wenn Sie vertraut mit vlookup für dieses

der Auflagetisch - LateRange

idrange   Range        Values 
    0    On time        0 
    1    Late < 1 min       60 
    2    Late by 1-2 min      120 
    3    Late by 2-3 min      180 
    4    Late by 3-4 min      240 
    5    Late by 4-5 min      300 
    6    Late by 5-6 min      360 
    7    Late by 6-7 min      420 
    8    Late by 7-8 min      480 
    9    Late >8 minutes 

OK. schließlich nehmen die delay gespeichert Tabelle mit dem Namen LateList, die Abfrage

SELECT Range, Values, 
     (SELECT COUNT(*) FROM LateList WHERE dbo.ufRange([delay]) = idrange) Frequency 
FROM LateRange 

ist, oder Sie können mit INNER JOIN und Unter Abfrage stattdessen ändern, wenn Sie mögen ..

Verwandte Themen