2010-02-10 96 views
5

我正在顯示下面給出的下表中的屬性。現在我要做的是,在以下條件下找到屬於同一位置的財產(假設我的財產位於sec-19,匹配sec-19,並且如果它們中沒有一個在那裏找到,則搜索整個城市)應該在10天之前發佈,或者如果沒有發佈10天,則以30天之前的結果爲準。有條件的SQL查詢

我有以下表(屬性)提到如下:

ID|Propertyid|Userid|Projectid|..|Price|...|Listing time|... http://www.freeimagehosting.net/uploads/1e5ee2e2ad.jpg

現在我想從該表中檢索什麼是「屬性ID」和這些屬性,其上市時間是「平均價格」如果他們中的任何一個都少於10天,則少於10天,然後將結果返回少於30天。

任何人都可以幫助我解決這個問題。提前致謝。

或者只是任何機構都可以在沒有位置匹配的情況下回答我。

我需要從10天前發佈的屬性計算「平均價格」,如果沒有任何財產發佈10天前,然後把它作爲30天前。事情是這樣的:

Select AVG(Price) As Average_Price from Properties where (DATEDIFF(day,listingtime,getdate())<30 or DATEDIFF(day,listingtime,getdate())<10) 

但是在這裏我得到只有一個字段「平均價格」,在這裏還我沒有把檢查過濾它是否已經發布10天前,30天前。 Knidly重新檢查並嘗試解決我的問題。提前致謝。

+1

社區wiki?真的嗎?我猜爲什麼失敗的興趣回答了這個問題,那肯定不是社區wiki的候選人。 – 2010-02-14 18:08:55

+0

您是否需要在一個查詢中執行此操作? – RobS 2010-02-20 13:19:51

+0

是... Plz幫助! – Sanju 2010-02-22 06:38:57

回答

1

我花了一些時間在此,我相信我解決了您的所有擔憂。我不完全確定城市或位置的數據類型,所以我用varchar(100)這應該解決你所有的擔憂。請評論是否存在您描述過這種情況並未解決的情況。

CREATE PROCEDURE [dbo].[GetRecentlyListedProperties] 
(@location varchar(100), @city varchar(100),@propertyID int) 
As 
Begin 
DECLARE @numberOfDays int, 
     @propertyCount int, 
     @IsLocation bit -- looking for a location and not a city  
SET @Propertycount = 0 
SET @numberOfDays= 10 
-- CHECK TO SEE IF THERE ARE LISTINGS IN THE LAST 10 DAYS IN THE SAME LOCATION 
SELECT @PropertyCount = 
Count(*) FROM properties where location = @location and DATEDIFF(day,listingtime,GETDATE()) < @numberOFDays 
and PropertyID != @propertyID 
If(@PropertyCount = 0) 
Begin 
-- CHECK TO SEE IF THERE ARE LISTINGS IN THE LAST 10 DAYS IN THE SAME CITY 
SELECT @PropertyCount = Count(*) from properties where city = @city 
     AND DATEDIFF(day,listingtime,GETDATE()) < @numberOFDays 
     AND PropertyID != @propertyID 
    IF(@PropertyCount = 0) 
    BEGIN 
    SET @NumberOfDays = 30 
    -- CHECK TO SEE IF THERE ARE LISTINGS IN THE LAST 30 DAYS IN THE SAME LOCATION 
    SELECT @PropertyCount = COUNT(*) from properties where location = @location 
      AND DATEDIFF(day,listingtime,GETDATE()) < @numberOFDays 
      AND PropertyID != @propertyID 
     IF(@PropertyCount = 0) 
     BEGIN 
     -- CHECK TO SEE IF THERE ARE LISTINGS IN THE LAST 30 DAYS IN THE SAME CITY 
     SELECT @PropertyCount = Count(*) from properties where city = @city 
       AND DATEDIFF(day,listingtime,GETDATE()) < @numberOFDays 
       AND PropertyID != @propertyID 
     END 
     ELSE 
     SET @IsLocation = 1 --There are properties in the same location in the last 30 days 
    END 
    ELSE 
    SET @IsLocation = 0 -- There are properties listed int he city in the last 10 days 
End 
Else 
SET @IsLocation = 1 
-- This is where the appropriate results are returned. 
IF(@IsLocation = 1) 
Begin 
SELECT * ,(SELECT AVG(PRICE) as AveragePrice 
     FROM PROPERTIES 
     WHERE DATEDIFF(day,listingtime,GETDATE()) < @numberOFDays 
     AND Location = @Location 
     AND PropertyID != @propertyID) 
FROM Properties 
WHERE DATEDIFF(day,listingtime,GETDATE()) < @numberOFDays 
     AND Location = @Location 
     AND PropertyID != @propertyID 
End 
ElSE 
SELECT * ,(SELECT AVG(PRICE) as AveragePrice 
     FROM PROPERTIES 
      WHERE DATEDIFF(day,listingtime,GETDATE()) < @numberOFDays 
      AND City = @City 
      AND PropertyID != @propertyID) 
FROM Properties 
WHERE DATEDIFF(day,listingtime,GETDATE()) < @numberOFDays 
     AND City = @City 
     AND PropertyID != @propertyID 
End 

您可能必須更改位置和城市的外鍵的某些數據類型,因爲我將它們用作varchars。

+0

它仍然不工作... 順便說一句,這不是我的要求! 我必須在同一地點找到房產(假設我的房產位於sec-19,匹配sec-19,如果他們都沒有在那裏找到,然後搜索整個城市),並且應該發佈以下條件10天后或者如果沒有10天后發佈,則以30天后的結果爲準。 – Sanju 2010-02-18 12:56:59

+0

如果你的數據類型和模式名稱是相同的,你應該能夠複製和過濾這個問題並使其工作。唯一使用的列名稱是listingtime,location,city和propertyid以及表格的屬性。 – awright18 2010-02-19 02:05:18

0

你上面描述的意思是,如果在過去10天有1個屬性,那麼你想列出那個單一的屬性。如果你想屬性ID列表(我用P.age是爲了簡化。)

SELECT * FROM properties P 
WHERE 
-- 10 days old records, if any: 
(((select count(1) from properties p1 where p1.age > 10) > 0) AND (P.age > 10)) 
OR 
-- 30 days old records, if zero 10-day-old records found: 
(((select count(1) from properties p1 where p1.age > 10) = 0) AND (P.age > 30)) 
+0

我需要從10天前發佈的屬性計算「平均價格」,如果沒有任何財產發佈10天前,然後將其視爲30天前。 類似的: 選擇SUM(Price)/ COUNT(PropertyId)作爲Average_Price from屬性 其中(DATEDIFF(day,listingtime,getdate())<30或DATEDIFF(day,listingtime,getdate())<10) 但在這裏我只得到一個場'平均價格',這裏我也沒有把檢查過濾器是否已發佈10天前或30天前。 Knidly重新檢查並嘗試解決我的問題。 在此先感謝。 – Sanju 2010-02-10 13:14:50

+0

使用SELECT AVG(Price)FROM [上述查詢] 由於這是多行的平均值,您將得到一個帶有一個字段的單行。 如果您需要結果集中的其他字段,則必須瞭解GROUP BY的工作原理。 – 2010-02-10 14:19:23

+0

是的,我知道按標準分組是如何工作的。它需要採取一些標準來對結果進行分組。但是,如果有多個字段需要返回,那麼使用group by就不好,因爲它會返回錯誤。 – Sanju 2010-02-11 10:37:49

0

,但只有一個平均價格爲所有的人,生活就會如果你做更多的更簡單:試試這個一個查詢。這聽起來像是使用存儲過程的好例子。你可以做這樣的:

  1. 通位置到存儲過程,並從那裏的位置相匹配
  2. 結果插入與物業ID,listingtime和avgprice(目前爲空)
  3. 一個臨時表的屬性選擇選擇DATEDIFF爲10天的行。如果結果爲0,請選擇DATEDIFF爲30天的行
  4. 從臨時表中選擇AVG價格,如果有數據,則在10天內過濾。將該值插入表格的每一行

您可能想要改變項目1和3的順序來查看哪個產生更好的性能。

0

應該有可能使用這樣的事情:

選擇部分,聚結(SELECT AVG(價格)從表IQ1其中Listingdate> DATEADD(天,-10,GETDATE())和oq.section = iq1.section,從表iq2中選擇平均值(價格),其中列出日期> dateadd(日,-30,getdate())和oq.section = iq2。0)作爲平均價格從表oq組

一對夫婦的筆記: 對不起,我不在我的電腦前,在一般用途的想法合併到第一個標準,並提供沒有記錄的平均值應該返回null,並使用第二個標準,如果最終沒有0. 0

另一件事是使用日期添加功能作爲上面來表達SARGable並且能夠使用索引。

希望這有助於 史蒂夫

編輯

這裏是我做了基本的測試代碼。這很簡單,並且會爲您提供過去10天內該部分的平均值,如果失敗,則爲該部分的最後30天,如果所有部分的最後10天都失敗,並且所有部分的最後30天都失敗。它也將分別給出1,2或4的行程類型。

我提前道歉的SQL顯示的狀態 - 我還沒有制定出如何格式化它很好地和它真的晚了:)

選擇sectionID,
COALESCE(
( (日期,-10,getdate())
和> oq.sectionID = iq1.sectionID),
(從平均價格iq2中選擇avg(價格),其中列出日期> dateadd (day,-30,getdate())
和> oq.sectionID = iq2.sectionID),
012 (日,-10,getdate())),
(從平均價格iq1選擇平均值(價格))其中上市日期> dateadd(日,-30,getdate()) ),
0)作爲averageprice,
CASE WHEN(選擇>平均(價格)從價格IQ1
其中Listingdate> DATEADD(天,-10,GETDATE())和
oq.sectionID = iq1.sectionID )is not NULL then 1 ELSE
CASE WHEN(select> avg(price)from price iq2
where listingdate> dateadd(day,-30,getdate())and
oq.sectionID = iq2.sectionID)IS NOT NULL THEN 2 ELSE
CASE WHEN(選擇>平均(價格)從價格IQ1
其中Listingdate> DATEADD(天,-10,GETDATE()))IS NOT NULL THEN 3 ELSE
CASE WHEN(選擇>平均(價格)從價格IQ1
其中Listingdate> DATEADD(天,-30,GETDATE()))IS NOT NULL THEN 4 ELSE
5 END END END END AS AverageType從價格OQ
其中通過sectionID
sectionID = @SectionID組

+0

你能否詳細闡述一下。 我希望這次你會在你的電腦前 – Sanju 2010-02-18 12:58:45

+0

嗨Sanju,抱歉的延誤。我更新了我的答案,因爲我無法在評論中使用腳本。 – MrCraze 2010-02-20 12:57:34