2017-07-26 153 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 
;