Sql如何在一个记录中组合两个记录并从表中选择任何一个字段

时间:2016-01-13 09:40:40

标签: sql sql-server

我无法获得我想要的记录。

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

对于同一个项目,我有两个记录。我知道这背后的原因。它是由于经度和纬度不同。我的问题是我想从这两个位置选择任何经度。我也希望这个记录在该项目的单一记录。

请帮我这样做。

1 个答案:

答案 0 :(得分: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

这个例子可以从一行获取Latitude,从另一行获取Longitude,所以如果你不关心这个值,我就不会提取它们。

修改
在你的评论中你说了另一个问题。如果您确定数据在此期间没有发生变化,并且没有看到它,我认为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'