2012-09-05 100 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 
     ;