我无法获得我想要的记录。
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
对于同一个项目,我有两个记录。我知道这背后的原因。它是由于经度和纬度不同。我的问题是我想从这两个位置选择任何经度。我也希望这个记录在该项目的单一记录。
请帮我这样做。
答案 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'