我有2张桌子。
制造商
优惠券
idCoupon
idManufacturer
discountPercent
COUPONCODE
startRange
endRange
我需要让所有制造商和优惠券一起获得最大的“discountPercent”,如果有任何可用的制造商。每个制造商应该只有一张优惠券。
这是我拥有的SQL,除了特定的场景(见下文)之外,它还可以使用:
DECLARE @maxdiscount TABLE
(
idmanufacturer INT
, discperc INT
)
INSERT INTO
@maxdiscount
SELECT
p.idmanufacturer
, max(discperc)
FROM
cp_manufacturers p
LEFT OUTER JOIN coupons c ON p.idmanufacturer = c.idmanufacturer
GROUP BY
p.idmanufacturer
SELECT
m.idmanufacturer
, m.discperc
, couponcode
FROM
@maxdiscount m
LEFT OUTER JOIN coupons c ON c.idmanufacturer = m.idmanufacturer AND c.discperc = m.discperc
问题是,如果制造商有两张优惠券,且SAME discountPercent,则会为该制造商退回2张优惠券。在这种情况下,我只想提取具有较大开始/结束范围的优惠券。
我坚持这一部分,任何帮助都会受到赞赏。
谢谢。
答案 0 :(得分:3)
你可以改变最后一部分
SELECT
m.idmanufacturer
, m.discperc
, c.couponcode
FROM
@maxdiscount m
LEFT OUTER JOIN coupons c ON c.idmanufacturer = m.idmanufacturer AND c.discperc = m.discperc
WHERE c.couponcode IS NULL OR
(c.endRange - c.startRange) =
(SELECT MAX(c1.endRange - c1.startRange)
FROM coupon c1
WHERE c1.idmanufacturer = c.idmanufacturer and c1.discperc = c.disperc)
答案 1 :(得分:2)
试试这个
Select m.*, c.*
From Manufacturers m
Left Join Coupons c
On c.id_Coupon =
(Select id_Coupon
From Coupons
Where idManufacturer = m.idManufacturer
And discountPercent =
(Select Max(discountPercent)
From Coupons
Where idManufacturer = m.idManufacturer)
And EndRange-StartRange =
(Select Max(EndRange-StartRange) rangeLength
From Coupons
Where idManufacturer = m.idManufacturer
And discountPercent =
(Select Max(discountPercent)
From Coupons
Where idManufacturer = m.idManufacturer)))
如果制造商,折扣百分比和范围长度只有一行,那么这个较短的版本也可能有用......
Select m.*, c.*
From Manufacturers m
Left Join Coupons c
On idManufacturer = m.idManufacturer
And discountPercent =
(Select Max(discountPercent)
From Coupons
Where idManufacturer = m.idManufacturer)
And EndRange-StartRange =
(Select Max(EndRange-StartRange) rangeLength
From Coupons
Where idManufacturer = m.idManufacturer
And discountPercent =
(Select Max(discountPercent)
From Coupons
Where idManufacturer = m.idManufacturer))
答案 2 :(得分:1)
如果您使用的是SQL Server 2005+,请尝试:将Insert语句更改为
;WITH CTE AS(
SELECT *,ROW_NUMBER() OVER(PARTITION BY P.IDMANUFACTURER ORDER BY DISCPERC DESC,
DATEDIFF(DD,STARTRANGE,ENDRANGE) DESC) AS ROW_NUM
FROM CP_MANUFACTURERS P
LEFT OUTER JOIN COUPONS C
ON P.IDMANUFACTURER = C.IDMANUFACTURER )
INSERT INTO @MAXDISCOUNT
SELECT IDMANUFACTURER ,DISCPERC FROM CTE
WHERE ROW_NUM=1
答案 3 :(得分:1)
没有开始/结束的东西(相当含糊......)
WITH guess AS (
SELECT idmanufacturer
, MAX(disperc) AS disperc
FROM coupons
GROUP BY idmanufacturer
)
SELECT
m.idmanufacturer
, COALESCE(g.discperc, 0)
FROM maxdiscount m
LEFT JOIN guess g ON g.idmanufacturer = m.idmanufacturer
;