2016-07-29 2 views
1

Ich habe einen Tisch mit Häusern.Wie verteilt man SQL-Ergebnisse über Spalte x?

City | Address | Price | NewRelease 
Auckland, 18 Queen St, 1000000, true 
Auckland, 21 Queen St, 1100000, false 
Auckland, 23 Queen St, 1150000, false 
Wellington, 23 Cuba St, 850000, false 
..... 

Was ich tun möchte, ist in der Lage sein, diese Liste abzufragen und eine Liste von x Häuser zurück, die in einer bestimmten Stadt sind, und ich möchte, dass die Liste so ausgeglichen wie möglich sein zwischen NewReleases, so Theres grob halb wahr und halb falsch. Die Funktion muss in der Lage sein, eine Eingabe darüber zu akzeptieren, wie viele Häuser aus einer Region zurückkehren sollen. So etwas wie houses_in_region (Betrag)

Manchmal kann es nicht genug von jedem sein, um einen 50/50 Split zu bekommen, dann ist es am wichtigsten, dass die gesamte richtige Zahl gerade zurückgegeben wird. Zum Beispiel, wenn Sie nach 10 Häuser in Wellington fragen, aber es gibt nur 12 Häuser in Wellington in der db und alle von ihnen sind NewRelease = false, dann sollte es nur 10 von denen zurückgeben. Wenn Sie jedoch dasselbe in Auckland fragen, wo es vielleicht 1000 gibt, sollten Sie 10 Häuser zurückgeben, von denen 5 NewRelease und 5 nicht sind.

Ist dies mit SQL möglich?

Vielen Dank für Ihre Hilfe Jungs!

Antwort

0

Sie können diese verwenden:

DECLARE @i int = 6, -- How many rows we want to show 
     @s int -- This will determine what will be inserted first 

DECLARE @Results TABLE (--Result table 
    City nvarchar(100), 
    [Address] nvarchar(100), 
    [Price] int, 
    [NewRelease] bit 
) 

SELECT @s = CASE WHEN SUM(CASE WHEN NewRelease = 1 THEN 1 ELSE 0 END) > SUM(CASE WHEN NewRelease = 0 THEN 1 ELSE 0 END) THEN 0 ELSE 1 END 
FROM YourTable 

INSERT INTO @Results -- Insert half of needed rows 
SELECT TOP (@i/2) * 
FROM YourTable 
WHERE NewRelease = @s 

SELECT @i = @i-COUNT(*) --Re-count how many rows we need more 
FROM @Results 

INSERT INTO @Results --Insert another part of rows 
SELECT TOP (@i) * 
FROM YourTable 
WHERE NewRelease != @s 

SELECT * --show data selected 
FROM @Results 
ORDER BY NewRelease DESC 
Verwandte Themen