关于MAX和条件的SQL连接表

时间:2012-09-05 17:09:45

标签: sql

我有2张桌子。

制造商

  • 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  

问题是,如果制造商有两张优惠券,且SAME discountPercent,则会为该制造商退回2张优惠券。在这种情况下,我只想提取具有较大开始/结束范围的优惠券。

我坚持这一部分,任何帮助都会受到赞赏。

谢谢。

4 个答案:

答案 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 
        ;