Sql 如果在列中有给定值,则从每个组中选择一条记录,否则选择任何一条记录
卖主 供应商详情Sql 如果在列中有给定值,则从每个组中选择一条记录,否则选择任何一条记录,sql,sql-server,join,aggregate-functions,Sql,Sql Server,Join,Aggregate Functions,卖主 供应商详情 VendorID | City 1 LosAngels 2 HongKong 主价值观 VendorDetailID | DetailCity | VendorID 11 Cairo 1 12 MosCow 1 13 Budapest 1 14 NewDelhi
VendorID | City
1 LosAngels
2 HongKong
主价值观
VendorDetailID | DetailCity | VendorID
11 Cairo 1
12 MosCow 1
13 Budapest 1
14 NewDelhi 2
15 Cairo 2
查询应返回每组VendorID的记录。如果其任何记录在DetailCity列中具有该值,则城市应为@GivenCityValue,否则城市应为Vendor表的City列中的值
这可以通过子查询和Case-When表达式实现
Text | Value
LosAngels LA
HongKong HK
Cairo CA
MosCow Mo
Budapest BU
NewDelhi ND
如果城市的给定值为@GivenCityValue='Moscow',则所需结果为
SELECT VendorID,
(SELECT Text FROM Mastervalues
Where Value IN(CASE WHEN (SELECT COUNT(*)
FROM VendorDetail
WHERE VendorID = Vendor.VendorID AND DetailCity = @GivenCityValue)>0
THEN @GivenCityValue
ELSE Vendor.City END)) AS City
FROM Vendor
但我正在尝试加入自己。我们需要任何用户定义的聚合函数吗?
使用join有什么办法吗?试试这个-
VendorID | City
1 MO
2 HK
SELECT VendorID
, City
FROM Vendor
OUTER APPLY (
SELECT City = [text]
FROM Mastervalues
WHERE EXISTS(
SELECT COUNT(*)
FROM VendorDetail
WHERE VendorID = Vendor.VendorID
AND DetailCity = @GivenCityValue
AND value = DetailCity
) OR Vendor.City = value
) t