1

私は2つのテーブルを持っています。

メーカー

  • idManufacturer

クーポン

  • idクーポン

  • idManufacturer

  • 割引率

  • クーポンコード

  • 開始範囲

  • 終了範囲

そのメーカーで利用できるクーポンがある場合は、すべてのメーカーと「discountPercent」が最大のクーポンを取得する必要があります。各メーカーはクーポンを 1 つだけ持つ必要があります。

これは私が持っている 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  

問題は、割引率が同じメーカーのクーポンが 2 つある場合に、そのメーカーに対して 2 つのクーポンが返されることです。この場合、開始/終了範囲が大きいクーポンのみを取得したいと考えています。

私はこの部分で立ち往生しています。どんな助けもいただければ幸いです。

ありがとうございました。

4

4 に答える 4

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)
于 2012-09-05T17:19:39.327 に答える
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)))

そのメーカー、割引率、および範囲の長さを含む行が1つしかない場合、この短いバージョンも機能する可能性があります...

  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))
于 2012-09-05T17:22:37.867 に答える
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 
        ;
于 2012-09-05T17:50:51.963 に答える
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
于 2012-09-05T17:24:34.947 に答える