2016-01-13 72 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 –

相關問題