2012-09-05 51 views
1

我有2个表。SQL在MAX上加入表和条件

制造商

  • idManufacturer

  • 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 

问题是,当有两个优惠券与同discountPercent的制造商,然后2张优惠券返回给该制造商。在这种情况下,我只想用较大的开始/结束范围来提取优惠券。

我被困在这部分,任何帮助将不胜感激。

谢谢。

+0

其中DATABSE,SQL服务器? –

+0

请删除/修改:每个制造商应该只有一张优惠券。 – Beth

+0

现在,这是什么{StartRange,EndRange}?用于休闲目的的varchar字段? – wildplasser

回答

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) 
+0

非常感谢您的回复,非常感谢。 @拉斐尔似乎是最简单的,并为我工作。 – Rivka

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)) 
+0

是的,错过了...编辑更正 –

1

如果您正在使用SQL Server 2005+然后尝试:

Chnage你的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 
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 
     ;