2010-02-10 42 views
5

Tôi đang hiển thị thuộc tính từ bảng sau đây. Bây giờ những gì tôi phải làm là tìm tài sản ở cùng một vị trí (giả sử tài sản của tôi nằm ở giây 19, khớp với sec-19 và nếu không tìm thấy ở đó thì tìm kiếm toàn bộ thành phố) với điều kiện sau nó sẽ được đăng 10 ngày trở lại hoặc nếu không được đăng 10 ngày trở lại so với kết quả trên cơ sở 30 ngày trở lại.Truy vấn Sql có điều kiện

Tôi đã theo bảng dưới đây (Properties) đề cập dưới đây:

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

Bây giờ những gì tôi muốn lấy từ bảng này là 'Bất Động Sản' và 'Giá trung bình' của các thuộc tính thời gian niêm yết mà là ít hơn 10 ngày nếu không ai trong số họ ít hơn 10 ngày sau đó trả lại kết quả trong ít hơn 30 ngày.

Ai cũng có thể giúp tôi giải quyết vấn đề này. Cảm ơn trước.

Hoặc chỉ Bất kỳ cơ thể nào cũng có thể trả lời tôi mà không có kết quả Vị trí.

Tôi cần tính 'Giá trung bình' từ các thuộc tính được đăng 10 ngày trước, nếu không có bất động sản nào được đăng cách đây 10 ngày thì hãy lấy nó là 30 ngày trước. Một cái gì đó như thế này:

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

Nhưng ở đây tôi chỉ nhận được một giá 'Giá trung bình' và ở đây tôi cũng không đặt séc để lọc xem nó đã được đăng 10 ngày trước hay 30 ngày trước. Knidly Recheck và cố gắng giải quyết vấn đề của tôi. Cảm ơn trước.

+1

Wiki cộng đồng? có thật không ? Tôi đoán lý do tại sao sự mất hứng thú trả lời câu hỏi này, đó chắc chắn không phải là ứng cử viên cho cộng đồng wiki. –

+0

Bạn có phải thực hiện điều này trong một truy vấn không? – RobS

+0

Có ... Plz Help! – Sanju

Trả lời

1

Tôi đã dành thời gian cho việc này và tôi tin rằng tôi đã giải quyết tất cả các mối quan tâm của bạn. Tôi đã không hoàn toàn chắc chắn về các kiểu dữ liệu của thành phố hoặc vị trí vì vậy tôi sử dụng varchar (100) Điều này sẽ giải quyết tất cả các mối quan tâm của bạn. Hãy bình luận nếu có một tình huống mà bạn mô tả rằng điều này không giải quyết được.

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 

Bạn có thể phải thay đổi một số kiểu dữ liệu cho khóa ngoài cho vị trí và thành phố khi tôi sử dụng chúng làm varchars.

+0

Vẫn không hoạt động ... Và bằng cách này, đây không phải là yêu cầu của tôi !!! Tôi phải tìm tài sản ở cùng một vị trí (giả sử tài sản của tôi nằm ở giây 19, khớp với sec-19 và nếu không tìm thấy ở đâu sau đó tìm kiếm toàn bộ thành phố) với điều kiện sau cần đăng 10 ngày trở lại hoặc nếu không được đăng 10 ngày trở lại so với kết quả trên cơ sở 30 ngày trở lại. – Sanju

+0

Tôi đã làm lại hoàn toàn vấn đề nếu các kiểu dữ liệu và tên lược đồ của bạn giống nhau, bạn có thể sao chép và qua quá trình này và làm việc đó. Các tên cột duy nhất được sử dụng là thời gian liệt kê, vị trí, thành phố và thuộc tính cũng như các thuộc tính cho bảng. – awright18

0

Điều bạn đã mô tả ở trên có nghĩa là nếu có 1 thuộc tính trong 10 ngày qua, thì bạn muốn liệt kê một tài sản duy nhất. Hãy thử điều này: (Tôi sử dụng P.age là vì đơn giản.)

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

Tôi cần tính 'Giá Trung bình' từ các thuộc tính được đăng 10 ngày trước, nếu không có bất động sản nào được đăng cách đây 10 ngày thì hãy lấy nó là 30 ngày trước. Một cái gì đó như thế này: Chọn SUM (Giá)/COUNT (PropertyId) Là Average_Price từ Thuộc tính trong đó (DATEDIFF (ngày, listingtime, getdate()) <30 hoặc DATEDIFF (ngày, listingtime, getdate()) <10) Nhưng ở đây tôi chỉ nhận được một trường 'Giá trung bình' và ở đây tôi cũng không đặt kiểm tra để lọc xem nó đã được đăng 10 ngày trước hay 30 ngày trước. Knidly Kiểm tra lại và cố gắng giải quyết vấn đề của tôi. Cảm ơn trước. – Sanju

+0

sử dụng SELECT AVG (Giá) TỪ [truy vấn trên] Bạn nhận được một hàng duy nhất với một trường vì đây là giá trị trung bình của nhiều hàng. Nếu bạn muốn các trường khác trong tập kết quả, bạn phải tìm hiểu cách GROUP BY hoạt động. –

+0

Có, tôi biết nhóm hoạt động theo tiêu chí như thế nào. Nó cần phải có một số tiêu chí để nhóm kết quả. Nhưng nơi có nhiều lĩnh vực được trả lại hơn là không tốt để sử dụng nhóm theo, bởi vì nó sẽ trả về lỗi. – Sanju

0

nếu bạn muốn có một danh sách các ID tài sản, nhưng chỉ có một mức giá trung bình cho tất cả trong số họ, cuộc sống sẽ đơn giản hơn nếu bạn làm nhiều hơn một truy vấn. điều này nghe có vẻ giống như một trường hợp tốt cho việc sử dụng một thủ tục được lưu trữ. bạn có thể làm điều đó như thế này:

  1. vượt qua vị trí vào trong thủ tục lưu trữ và chọn từ các thuộc tính nơi vị trí phù hợp với
  2. chèn kết quả vào một bảng tạm thời với Động Sản, listingtime và avgprice (chưa có hàng)
  3. chọn các hàng có DATEDIFF là 10 ngày. nếu 0 kết quả, hãy chọn các hàng có DATEDIFF trong 30 ngày
  4. chọn giá AVG từ bảng tạm thời, lọc trên 10 ngày nếu có dữ liệu. chèn giá trị đó vào mỗi hàng của bảng

bạn có thể muốn thay đổi thứ tự của các mục 1 và 3 để xem hiệu suất nào tốt hơn.

0

Nó nên có thể sử dụng một cái gì đó như thế này:

chọn phần, kết thành một khối (chọn trung bình (Price) từ bảng iq1 nơi Listingdate> dateadd (ngày, -10, getdate()) và oq.section = iq1.section, chọn avg (price) từ bảng iq2 trong đó Listingdate> dateadd (ngày, -30, getdate()) và oq.section = iq2.phần, 0) dưới dạng giá trung bình từ nhóm bảng oq theo phần

Một vài lưu ý: xin lỗi Tôi không ở phía trước máy tính của mình vì vậy tôi không thể đọc bằng chứng này và các dấu ngoặc có thể đã hết, nhưng đó là ý tưởng trong sử dụng chung kết hợp với một trong hai tiêu chí đầu tiên và cung cấp không có hồ sơ trung bình nên trả về null và sử dụng tiêu chí thứ hai và nếu không có điều kiện nào cuối cùng 0.

Điều khác là sử dụng chức năng thêm ngày làm ở trên để biểu hiện SARGable và có thể sử dụng các chỉ mục.

Hope this helps, Steve

EDIT

Đây là mã mà tôi đã thực hiện thử nghiệm cơ bản trên. Nó rất đơn giản và sẽ cung cấp cho bạn mức trung bình đầu tiên cho phần đó trong 10 ngày qua, thất bại, 30 ngày qua cho phần đó, thất bại trong 10 ngày qua cho tất cả các phần và thất bại trong 30 ngày qua cho tất cả các phần . Nó cũng sẽ cho một loại hành tinh tương ứng là 1,2,3 hoặc 4.

Tôi xin lỗi trước cho trạng thái của màn hình SQL - Tôi chưa làm việc ra làm thế nào để định dạng nó độc đáo và nó thực sự cuối :)

chọn sectionid,
liên hiệp (
(chọn avg (Giá) từ Giá iq1 trong đó Listingdate> dateadd (ngày, -10, getdate())
và> oq.sectionID = iq1.sectionID),
(chọn avg (giá) từ Giá iq2 nơi Listingdate> dateadd (ngày, -30, getdate())
và> oq.sectionID = iq2.sectionID),
(chọn avg (Giá) từ Giá iq1 trong đó Listingdate> dateadd (ngày, -10, getdate())),
(chọn avg (Giá) từ Giá iq1 trong đó Listingdate> dateadd (ngày, -30, getdate())),
0) như averageprice,
CASE kHI (chọn> trung bình (Price) từ giá iq1
nơi Listingdate> dateadd (ngày, -10, getdate()) và
oq.sectionID = iq1.sectionID) KHÔNG SỐ NULL THEN 1 ELSE
TRƯỜNG HỢP KHI (chọn> avg (giá) từ Giá iq2
trong đó Listingdate> dateadd (ngày, -30, getdate()) và
oq.sectionID = iq2.sectionID) KHÔNG NULL THEN 2 ELSE
TRƯỜNG HỢP KHI NÀO (chọn> avg (Giá) từ Giá iq1
nơi Listingdate> dateadd (ngày, -10, getdate())) KHÔNG SỐ NULL THEN 3 ELSE
TRƯỜNG HỢP KHI (chọn> avg (Giá) từ Giá iq1
nơi Listingdate> dateadd (ngày, -30, getdate())) IS NOT NULL THEN 4 ELSE
5 END END END END AS AverageType từ Giá OQ
nơi sectionid = @SectionID nhóm bằng sectionid

+0

Bạn có thể xây dựng nhiều hơn thế này không. Tôi hy vọng lần này bạn sẽ ở phía trước máy tính của bạn – Sanju

+0

Hi Sanju, xin lỗi vì sự chậm trễ. Tôi đã cập nhật câu trả lời của mình vì tôi không thể phù hợp với tập lệnh trong nhận xét. – MrCraze

Các vấn đề liên quan