2016-01-13 112 views
-1

我无法获取我想要的记录。Sql如何结合一个记录中的两条记录,并从表中选择任意一个字段

SELECT 
    ROW_NUMBER() OVER(order by CAST(pr.District As INT) ASC) AS Row, 
    pr.District, pr.Project, pr.Tenure, 
    CASE pr.CompletionDate 
     WHEN NULL THEN 'UNKNOWN' 
     WHEN '' THEN 'UNKNOWN' 
     ELSE pr.CompletionDate 
    END AS COMPLETIONYEAR, 
    pr.AVG_PSF, pr.NoOfTransaction, 
    p.AVG_PSFRENTAL, p.RentalContract, 
    ROUND(((p.MAXRENT * 1200)/ pr.MAXPRICE),2,0) AS RENTAL_YIELD, 
    pr.Latitude, pr.Longitude, 
    CASE 
     WHEN ROUND(((p.MAXRENT * 1200)/ pr.MAXPRICE),2,0) < 3.0 
     THEN 'http://maps.google.com/mapfiles/ms/icons/blue.png' 
     WHEN ROUND(((p.MAXRENT * 1200)/ pr.MAXPRICE),2,0) > 3.0 
      AND ROUND(((p.MAXRENT * 1200)/ pr.MAXPRICE),2,0) < 4.0 
     THEN 'http://maps.google.com/mapfiles/ms/icons/green.png' 
     WHEN ROUND(((p.MAXRENT * 1200)/ pr.MAXPRICE),2,0) > 4.0 
      AND ROUND(((p.MAXRENT * 1200)/ pr.MAXPRICE),2,0) < 5.0 
     THEN 'http://maps.google.com/mapfiles/ms/icons/red.png' 
     ELSE 'http://maps.google.com/mapfiles/ms/icons/yellow.png' 
    END AS MARKER 
FROM 
    (SELECT 
     District, Project, 
     MAX(Rent) AS MAXRENT, 
     ROUND(AVG((Rent/MaxArea)), +2, 0) AS AVG_PSFRENTAL, 
     COUNT(PrivateURARentalID) AS RentalContract 
    FROM 
     (SELECT 
       PrivateURARentalID, District, Project, 
       Rent, MaxArea, RentalDate 
      FROM 
       PrivateURARental 
      WHERE 
       RentalDate >= DATEADD(MONTH,DATEDIFF(MONTH, 0, GETDATE()) - 6, 0) 
       AND Project = 'QUEENS') [temp] 
    GROUP BY 
     Project, District 
    HAVING 
     COUNT(PrivateURARentalID) > 3) [p] 
INNER JOIN 
    (SELECT 
     District, Project, Tenure, CompletionDate, 
     ROUND(AVG(psf),0,0) AS AVG_PSF, 
     MAX(price) AS MAXPRICE, 
     COUNT(psf) AS NoOfTransaction, 
     Latitude, Longitude 
    FROM 
     (SELECT 
       PrivateID, District, Project, Tenure, 
       CompletionDate, psf, Price, 
       Latitude, Longitude 
      FROM 
       Private 
      WHERE 
       [ContractDate] >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - 6, 0) 
       AND Project = 'QUEENS') [temp] 
    GROUP BY 
     Project, District, Tenure, CompletionDate, 
     Latitude, Longitude 
    HAVING COUNT(PrivateID) > 3) pr ON p.Project = pr.Project 
ORDER BY 
    CAST(pr.District As INT) ASC 

现在从该查询我得到这样的结果:

     1 3 QUEENS 99 Yrs From 16/02/1998 2002 1264 4 3.84 89 4.96 1.2925986 103.8072896 http://maps.google.com/mapfiles/ms/icons/red.png 
         2 3 QUEENS 99 Yrs From 16/02/1998 2002 1231 5 3.84 89 4.85 1.2936208 103.8063609 http://maps.google.com/mapfiles/ms/icons/red.png 

为同一个项目我有两个records.I知道this.Its背后的原因是由于不同的经度和latitude.My问题我想从这两个位置选择经度中的任何一个。我还希望将这些记录记录在该项目的单个记录中。

请帮我这么做。

+1

哪个RDBMS是这样的?请添加一个标签来指定您是使用'mysql','postgresql','sql-server','oracle'还是'db2' - 或者其他的东西。 –

回答

1

如果你不想按字段分组......不要按它分组。 :)你想要的任何值这个领域,你可以像使用MIN或MAX一些聚合函数来获取一些这样的价值:

SELECT 
    ROW_NUMBER() OVER(order by CAST(pr.District As INT) ASC) AS Row, 
    pr.District, 
    pr.Project, 
    pr.Tenure, 
    CASE pr.CompletionDate 
    WHEN NULL THEN 'UNKNOWN' 
    WHEN '' THEN 'UNKNOWN' 
    ELSE pr.CompletionDate 
    END AS COMPLETIONYEAR, 
    pr.AVG_PSF, 
    pr.NoOfTransaction, 
    p.AVG_PSFRENTAL, 
    p.RentalContract, 
    ROUND(((p.MAXRENT * 1200)/ pr.MAXPRICE),2,0) AS RENTAL_YIELD, 
    pr.Latitude, 
    pr.Longitude, 
    CASE 
    WHEN ROUND(((p.MAXRENT * 1200)/ pr.MAXPRICE),2,0) < 3.0 THEN 'http://maps.google.com/mapfiles/ms/icons/blue.png' 
    WHEN ROUND(((p.MAXRENT * 1200)/ pr.MAXPRICE),2,0) > 3.0 and ROUND(((p.MAXRENT * 1200)/ pr.MAXPRICE),2,0) < 4.0 THEN 'http://maps.google.com/mapfiles/ms/icons/green.png' 
    WHEN ROUND(((p.MAXRENT * 1200)/ pr.MAXPRICE),2,0) > 4.0 and ROUND(((p.MAXRENT * 1200)/ pr.MAXPRICE),2,0) < 5.0 THEN 'http://maps.google.com/mapfiles/ms/icons/red.png' 
    ELSE 'http://maps.google.com/mapfiles/ms/icons/yellow.png' 
    END AS MARKER 
FROM 
(
    SELECT 
     District, 
     Project, 
     MAX(Rent) AS MAXRENT, 
     ROUND(AVG((Rent/MaxArea)),+2,0) AS AVG_PSFRENTAL, 
     COUNT(PrivateURARentalID) AS RentalContract 
    FROM 
    (
     SELECT 
      PrivateURARentalID, 
      District, 
      Project, 
      Rent, 
      MaxArea, 
      RentalDate 
     FROM 
      PrivateURARental 
     WHERE 
      RentalDate >= DATEADD(MONTH,DATEDIFF(MONTH,0,GETDATE())-6,0) and Project='QUEENS' 
    )[temp] 
    GROUP BY 
     Project, 
     District 
    HAVING 
     COUNT(PrivateURARentalID) > 3 
) [p] 
inner join (
    SELECT 
     District, 
     Project, 
     Tenure, 
     CompletionDate, 
     ROUND(AVG(psf),0,0) AS AVG_PSF, 
     MAX(price) AS MAXPRICE, 
     COUNT(psf) AS NoOfTransaction 
     ,MAX(Latitude) as Latitude, 
     MAX(Longitude) as Longitude 
    FROM 
    (
     SELECT 
      PrivateID, 
      District, 
      Project, 
      Tenure, 
      CompletionDate, 
      psf, 
      Price 
      ,Latitude, 
      Longitude 
     FROM 
      Private 
     WHERE 
      [ContractDate] >= DATEADD(MONTH,DATEDIFF(MONTH,0,GETDATE())-6,0) 
     and Project='QUEENS' 
    )[temp] 
    GROUP BY 
     Project, 
     District, 
     Tenure, 
     CompletionDate 
     --,Latitude, 
     --Longitude 
    HAVING 
     COUNT(PrivateID) > 3 
) pr ON p.Project = pr.Project 
order by CAST(pr.District As INT) ASC 

这个例子hoever可以从一个行和经度从其他获取纬度,所以如果你不关心这个价值观,我就不会去取他们。

编辑
在你的评论你说了另一个问题。如果您确定数据没有在此期间发生变化,并且没有看到它,我认为HAVING COUNT(PrivateID) > 3子句云会更改NoOfTransaction以及经度和纬度变化。
这是由你来分析这个行为,并看到它是好的,或不。这是关于解释数据。 9或12是否正确? 你应该能够通过执行这个查询来看看发生了什么:

SELECT 
    District, 
    Project, 
    Tenure, 
    CompletionDate, 
    psf, 
    Latitude, 
    Longitude 
FROM Private 
WHERE 
    ContractDate >= DATEADD(MONTH,DATEDIFF(MONTH,0,GETDATE())-6,0) 
and Project='QUEENS' 
+0

它有一条记录但事务字段总数在上面的例子4,5中,但现在它在新记录中,它是12. –

+0

嗯,也许DB中的数据同时发生了变化?你能否重新运行你的原始查询并检查是否还有4和5?如果这不解决问题,我无法帮助你没有数据。 –

+0

查看我提到的数据记录的问题。如果我们合并它们,那么它将被视为单个记录,因此交易的总数将是4 + 5 = 9 –

相关问题