2016-12-16 10 views
0

Ich muss die meisten Vorkommen in einem Alter von 10 Jahren finden, die Alter von 2 bis 22, 15 bis 25, 10 bis 20, etc. in einer Tabelle mit name & age sein könnenFinden Sie eine durchschnittliche Altersspanne über eine Spannweite von Jahren

ich habe die SQL erstellt, die das Durchschnittsalter zurückgibt:

SELECT age, count(age) 
FROM member 
GROUP BY age 
ORDER BY COUNT(age) DESC 
LIMIT 1 

Vielen Dank für Ihre Hilfe!

+0

Ich glaube nicht, dass Sie dies mit einem einzigen SQL-Aufruf tun können. Vielleicht möchten Sie etwas über gespeicherte Prozeduren und Transact SQL (je nachdem, welchen Server Sie verwenden) recherchieren. –

+0

Ihre Tabelle hinzufügen und einige Beispieldaten anzeigen – e4c5

+0

@PaulColdrey - Transact SQL wird nicht von großem Nutzen sein, da sie die markiert haben Frage 'mysql' – Tony

Antwort

0

eine andere Tabelle erstellen ages das Alter zu halten, reicht man in einem Feld interessiert sind für age_lower, age_upper und dem Anzeigenamen age_range wie ‚2 bis 22‘

Verknüpfen Sie die Tabellen mit einer WHERE Klausel, die legt Alter zwischen den unteren und oberen Bereichen.

SELECT `age_range`, COUNT(`age`) AS age_count 
FROM `member` INNER JOIN `ages` 
    ON age BETWEEN age_lower AND age_upper 
GROUP BY age_range 
ORDER BY COUNT(`age`) DESC, `age_range` ASC 

SQL Fiddle

+0

Ich werde es versuchen Danke! – user3014571

+0

@ user3014571 - Ich habe das SQL, das Syntaxfehler hatte, korrigiert und eine SQL Fiddle-Beispieldatei hinzugefügt. – Tony

+0

Leider verwendet dies immer noch festgelegte Altersbereiche, die in dem Schema definiert sind. 1-10,11-20 usw. Ich brauche es, um diese Bereiche zu generieren. Alter 2 bis 22, 15 bis 25, 10 bis 20, usw. – user3014571

0

Dies könnte das Problem lösen. Die einzige Sache, die ich hinzufügte, war eine Tabelle, um Werte 1..x zu halten, in denen x deine Schaufelzahl ist. Das @T kann leicht durch Ihren MySQL-Tabellennamen ersetzt werden. Die Ergebnisse sind alle möglichen Sätze, in denen das Alter für jedes Alter fällt. Zählen Sie dann, wie viele gleiche Mengen Sie haben.

--IGNORE BUILDING TEST DATA IN SQL SERVER 
    DECLARE @T TABLE(member INT,age INT) 
    DECLARE @X INT 
    SET @X=1 
    WHILE(@X<=100) BEGIN 
     INSERT INTO @T SELECT @X, CAST(RAND() * 100 AS INT) 
     SET @[email protected]+1 
    END 

    DECLARE @MinAge INT=1 
    DECLARE @MaxAge INT=100 

    --YOUR SET TABLE. TO MAKE LIFE EASY YOU NEED A TABLE OF 1..X 
    DECLARE @SET TABLE (Value INT) 
    DECLARE @SET_COUNT INT =10 
    DECLARE @LOOP INT=1 
    WHILE(@LOOP<[email protected]_COUNT) BEGIN 
     INSERT @SET SELECT @LOOP 
     SET @[email protected]+1 
    END 

    SELECT 
     MinAge, 
     MaxAge, 
     SetCount=COUNT(CountFlag) 
    FROM 
    (
     SELECT 
      MinAge=AgeMinusSetCount, 
      MaxAge=AgePlusSetCount, 
      CountFlag=1 
     FROM 
     (
      SELECT DISTINCT 
       ThisAge, 
       AgeMinusSetCount=(AgeMinusSetCount-1) + Value, 
       AgePlusSetCount=CASE WHEN (AgeMinusSetCount-1) + Value + @SET_COUNT > @MaxAge THEN @MaxAge ELSE (AgeMinusSetCount-1) + Value + @SET_COUNT END 
      FROM 
      (
       SELECT 
        ThisAge=age, 
        AgeMinusSetCount=CASE WHEN (age - @SET_COUNT) < @MinAge THEN @MinAge ELSE (age) - @SET_COUNT END 
       FROM 
        @T  
      )RANGES  
      LEFT OUTER JOIN (SELECT Value FROM @SET) AS FanLeft ON 1=1 
     )AS DETAIL 
    )AS Summary 
    GROUP BY 
     MinAge, 
     MaxAge 
    ORDER BY 
     COUNT(CountFlag) DESC 
Verwandte Themen