2010-02-10 13 views
5

Estoy mostrando una propiedad de la siguiente tabla que figura a continuación. Ahora lo que tengo que hacer es encontrar la propiedad en la misma ubicación (supongamos que mi propiedad está ubicada en la sec-19, coincide con la sec-19 y si ninguna de ellas se encuentra allí, busque toda la ciudad) con la siguiente condición que debe publicarse 10 días atrás o si no se publica 10 días antes de tomar el resultado en base a 30 días atrás.Condicional Sql Query

tengo el siguiente cuadro (Propiedades) se mencionan a continuación:

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

Ahora lo que quiero recuperar de esta tabla es el 'ID de la propiedad' y 'Precio promedio' de esas propiedades cuyo tiempo de cotización tiene menos de 10 días si ninguno de ellos es inferior a 10 días, luego devuelva el resultado por menos de 30 días.

¿Alguien me puede ayudar a resolver este problema. Gracias por adelantado.

O simplemente cualquier cuerpo puede responderme sin la coincidencia de ubicación.

Necesito calcular 'Precio promedio' de las propiedades publicadas hace 10 días, si no hay ninguna propiedad publicada hace 10 días, tómela como hace 30 días. Algo como esto:

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

Pero aquí estoy recibiendo sólo un campo 'precio promedio' y aquí también que no estoy poniendo el cheque para filtrar si se ha publicado hace 10 días o hace 30 días. Knidly Vuelva a verificar e intente resolver mi problema. Gracias por adelantado.

+1

Wiki de la comunidad? De Verdad ? Supongo por qué el interés perdido en responder esta pregunta, que ciertamente no es candidato para la wiki de la comunidad. –

+0

¿Tienes que hacer esto en una consulta? – RobS

+0

Sí ... ¡Por favor ayuda! – Sanju

Respuesta

1

Pasé un tiempo en esto y creo que abordé todas sus inquietudes. No estaba completamente seguro de los tipos de datos de la ciudad o la ubicación, así que utilicé varchar (100) Esto debería abordar todas sus inquietudes. Comente si hay una situación que describió que esto no resuelve.

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 

Es posible que tenga que cambiar algunos tipos de datos de claves externas para la ubicación y la ciudad como los utilicé como varchars.

+0

Todavía no está funcionando ... Y por cierto este no es mi requisito !!! Tengo que encontrar la propiedad en la misma ubicación (supongamos que mi propiedad se encuentra en la sec-19, coincide con la sec-19 y si ninguna de ellas se encuentra allí, busque toda la ciudad) con la siguiente condición de que deba publicarse 10 días atrás o si ninguno se publica 10 días antes que el resultado en base a 30 días atrás. – Sanju

+0

He vuelto a trabajar el problema completamente si sus tipos de datos y nombres de esquema son los mismos que debería poder copiar y pasar esto y hacer que funcione. Los únicos nombres de columna utilizados son listingtime, location, city y propertyid, así como las propiedades de la tabla. – awright18

0

Lo que describió anteriormente significa, que si hay 1 propiedad en los últimos 10 días, entonces desea incluir esa sola. Prueba esto: (yo uso P.age es por simplicidad.)

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

Necesito calcular 'Precio promedio' de las propiedades publicadas hace 10 días, si no hay ninguna propiedad publicada hace 10 días, tómela como hace 30 días. Algo como esto: Seleccione SUM (Precio)/COUNT (PropertyId) Como Average_Price de Properties donde (DATEDIFF (día, listingtime, getdate()) <30 o DATEDIFF (día, listingtime, getdate()) <10) Pero aquí obtengo un solo 'Precio promedio' de campo y aquí tampoco estoy poniendo el cheque para filtrar si ha sido publicado hace 10 días o 30 días. Knidly Vuelva a verificar y trate de resolver mi problema. Gracias de antemano. – Sanju

+0

use SELECCIONAR AVG (Precio) DESDE [la consulta anterior] Obtiene una sola fila con un campo porque este es un valor promedio de muchas filas. Si quiere otros campos en el conjunto de resultados, debe conocer cómo funciona GROUP BY. –

+0

Sí, sé cómo funciona el grupo por criterios. Necesita tomar algunos criterios para agrupar el resultado. Pero donde hay muchos campos para devolver que no es bueno usar group by, porque devolverá el error. – Sanju

0

si desea una lista de ID de propiedad, pero sólo un único precio medio de todos ellos, la vida será más sencillo si lo hace más de una consulta esto suena como un buen caso para usar un procedimiento almacenado. usted podría hacerlo de esta manera:

  1. localización de paso en el procedimiento almacenado y seleccione una de las propiedades donde la ubicación coincide con
  2. insertar los resultados en una tabla temporal con el ID de la propiedad, listingtime y avgprice (VACIO)
  3. seleccione filas con un DATEDIFF de 10 días. si resulta 0, seleccione las filas con un DATEDIFF de 30 días
  4. seleccione el precio AVG de la tabla temporal, filtrando en 10 días si hay datos. inserte ese valor en cada fila de la tabla

es posible que desee jugar cambiando el orden de los elementos 1 y 3 para ver cuál produce un mejor rendimiento.

0

Debería ser posible utilizar algo como esto:

sección de selección, se unen (select avg (precio) de IQ1 mesa donde Listingdate> dateadd (día, -10, getdate()) y oq.section = iq1.section, seleccione avg (price) de la tabla iq2 donde Listingdate> dateadd (day, -30, getdate()) y oq.section = iq2.sección, 0) como averageprice de la tabla oq grupo por sección

Un par de notas: lo siento, no estoy delante de mi pc, así que no pude probar esto y los corchetes pueden estar fuera, pero ese es el idea en-uso general aglutinan a cualquiera de los primeros criterios y siempre que no existan registros de la media debe devolver null y utilizar el segundo criterio y si eso no tiene ninguno, finalmente 0.

la otra cosa es utilizar la fecha de añadir la función como arriba para hacer que la expresión SARGable sea capaz de usar índices.

Espero que esto ayude, Steve

EDITAR

Aquí está el código que he hecho pruebas básicas sucesivamente. Es simple, y le dará primero el promedio para esa sección durante los últimos 10 días, en su defecto, los últimos 30 días para la sección, en su defecto los últimos 10 días para todas las secciones y en su defecto los últimos 30 días para todas las secciones . También le dará un tipo de valor de 1,2,3 o 4 respectivamente.

Me disculpo de antemano por el estado de la pantalla de SQL - Estoy todavía a encontrar la manera de darle formato muy bien, y su muy tarde :)

seleccione sectionid,
se unen (
(seleccione avg (Precio) desde Precios iq1 donde Fecha de inclusión> fechaadd (día, -10, fechada())
y> oq.sectionID = iq1.sectionID),
(seleccione promedio (precio) a partir de los precios iq2 donde Fecha de inclusión> dateadd (día, -30, getdate())
y> oq.sectionID = iq2.sectionID),
(seleccione avg (Precio) de Prices iq1 donde Fecha de inclusión> fechaadd (día, -10, fechada())),
(seleccione avg (Precio) desde Precios iq1 donde Fecha de inclusión> fechaadd (día, -30, fechada())),
0) como averageprice,
CASO cUANDO (seleccione> avg (precio) de precios IQ1
donde Listingdate> dateadd (día, -10, getdate()) y
oq.sectionID = iq1.sectionID) no es nulo then 1 else
CASO cUANDO (select> avg (precio) de precios iQ2
donde Listingdate> dateadd (día, -30, getdate()) y
oq.sectionID = iq2.sectionID) NO ES NULL THEN 2 ELSE
CASO CUANDO (select> avg (precio) de precios IQ1
donde Listingdate> dateadd (día, -10, getdate())) no es nulo, 3 ELSE
CASO CUANDO (seleccione> avg (precio) de precios IQ1
donde Listingdate> dateadd (días, -30, getdate())) no es NULL ENTONCES 4 ELSE
5 END END END AS AverageType FIN de precios OQ
donde sectionid = @SectionID grupo por sectionid

+0

¿Puedes elaborar más que esto? Espero que esta vez estarías en frente de tu PC – Sanju

+0

Hola Sanju, disculpa por la demora. Actualicé mi respuesta ya que no puedo ajustar el guión en el comentario. – MrCraze