2017-07-26 204 views
0

編輯的問題:用條件邏輯掙扎

我似乎無法弄清楚我的查詢的條件邏輯。

我確定這很簡單,但我一直在這個車輪上旋轉太久 - 這只是其中的一個。

任何幫助總是讚賞。

當前查詢:

SELECT 
    r.WidgetPK 
    ,r.WidgetName 
    ,r.WeightRateFlag      [WeightRateFlag] 
    ,r.Rate         [Rate] 
    ,r.Breakpoint       [Breakpoint] 
    ,MAX(ISNULL(f.ShippingFee,0))   [ShippingFee] 
    ,MAX(ISNULL(f.OtherFee,0))    [OtherFee] 
    ,MAX(r.weight)       [Weight] 
FROM 
    #Rates r 
    LEFT JOIN #Fees f ON f.WidgetPK = r.WidgetPK 

我離開了GROUP BY的簡單性。

如果WeightRateFlag在每個WidgetPK的ANY行中都有1,那麼將不會返回所有具有0的行。如果WeightRateFlag沒有其中有1的行,那麼將返回所有行。

對不起,原來的問題不清楚 - 搜索沒有幫助,我問了一個同事。我認爲我的問題可能只是因爲我在這裏和我的搜索中提出了錯誤的問題。

+2

請包括[MCVE(即輸入,預期的輸出和查詢你有這麼遠)和標記您的RDBMS平臺。 – Igor

+1

考慮使用一個UNION所有,第一個查詢獲得1與第二個人排除任何記錄,其中任何一個1 – HLGEM

+0

@HLGEM a UNION ALL是什麼讓我到這一點#Rates臨時表是聯盟另外兩張桌子。我沒有創建表格,也沒有編輯功能。大部分WidgetPK都在UNION的第一張表中,少數在第二個BUT中,如果他們在第二個,他們也在第一個 – DRT

回答

1
SELECT 
r.WidgetPK 
,r.WidgetName 
,r.WeightRateFlag      [WeightRateFlag] 
,r.Rate         [Rate] 
,r.Breakpoint       [Breakpoint] 
,MAX(ISNULL(f.ShippingFee,0))   [ShippingFee] 
,MAX(ISNULL(f.OtherFee,0))    [OtherFee] 
,MAX(r.weight)       [Weight] 
FROM 
#Rates r 
LEFT JOIN #Fees f ON f.WidgetPK = r.WidgetPK 
WHERE r.WeightRateFlag = 1 
UNION ALL 
SELECT 
r.WidgetPK 
,r.WidgetName 
,r.WeightRateFlag      [WeightRateFlag] 
,r.Rate         [Rate] 
,r.Breakpoint       [Breakpoint] 
,MAX(ISNULL(f.ShippingFee,0))   [ShippingFee] 
,MAX(ISNULL(f.OtherFee,0))    [OtherFee] 
,MAX(r.weight)       [Weight] 
FROM 
#Rates r 
LEFT JOIN #Fees f ON f.WidgetPK = r.WidgetPK 
WHERE r.WeightRateFlag = 0 
AND NOT EXISTS (SELECT * FROM #rates r2 WHERE r2WeightRateFlag =1 AND r.WidgetName = r2.WidgetName) 
+0

+1感謝這個工作 - 我可能需要微調它,因爲它正在性能受到影響,但這是正確的道路。 – DRT

+0

最有可能的是,您可以在創建#rates的過程中做類似的事情。或者可以對臨時表進行索引。 – HLGEM

0

看起來有些複雜,但CTE可以非常有幫助。另外他們應該與優化器一起工作得很好。修改你需要的列。

/* TEST DATA SETUP */ 
IF OBJECT_ID(N'tempdb..#t1') IS NOT NULL 
BEGIN 
    DROP TABLE #t1 
END 
CREATE TABLE #t1 (WidgetPK int, col1 varchar(19), WeightRateFlag bit, ShippingFee money, OtherFee money, [Weight] int); 
INSERT INTO #t1 (WidgetPK, col1, WeightRateFlag, ShippingFee, OtherFee, [Weight]) 
VALUES 
     (1, 'showme1', 1, 9, 1, 1) 
    , (1, 'noshow2', 0, 2, 9, 2) 
    , (1, 'noshow3', 0, 1, 2, 9) 
    , (2, 'showme1', 1, 9, 9, 9) 
    , (3, 'showme1', 0, 1, 9, 1) 
    , (3, 'showme2', 0, 9, 9, 9) 
    , (3, 'showme3', 0, 9, 1, 9) 
; 

/* QUERY STARTS HERE */ 
WITH cte1 AS (
    SELECT x1.* 
    FROM (
     SELECT #t1.WidgetPK, #t1.col1, #t1.WeightRateFlag, #t1.ShippingFee, #t1.OtherFee, #t1.[Weight] 
      , RANK() OVER (PARTITION BY #t1.WidgetPK ORDER BY #t1.WeightRateFlag DESC) AS rn 
     FROM #t1 
    ) x1 WHERE x1.rn = 1 

) 
, cte2 AS (
    SELECT cte1.WidgetPK 
     , MAX(cte1.ShippingFee) AS ShippingFee 
     , MAX(cte1.OtherFee) AS OtherFee 
     , MAX(cte1.[Weight]) AS [Weight] 
    FROM cte1 
    GROUP BY cte1.WidgetPK 
) 
SELECT cte1.WidgetPK, cte1.col1, cte1.WeightRateFlag, cte2.ShippingFee, cte2.OtherFee, cte2.[Weight] 
FROM cte1 
LEFT OUTER JOIN cte2 ON cte1.WidgetPK = cte2.WidgetPK 
;