Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 与条件逻辑抗争_Sql Server_Tsql_Ssms - Fatal编程技术网

Sql server 与条件逻辑抗争

Sql server 与条件逻辑抗争,sql-server,tsql,ssms,Sql Server,Tsql,Ssms,编辑问题: 我似乎无法理解我的查询的条件逻辑 我确信这很简单,但我已经在这上面转了太久了——这只是其中的一天 任何帮助都会得到感激 当前查询: SELECT r.WidgetPK ,r.WidgetName ,r.WeightRateFlag [WeightRateFlag] ,r.Rate [Rate] ,r.Breakpoint

编辑问题:

我似乎无法理解我的查询的条件逻辑

我确信这很简单,但我已经在这上面转了太久了——这只是其中的一天

任何帮助都会得到感激

当前查询:

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
为了简单起见,我把这一组删去了

如果每个WidgetPK的任何行中的WeightRateFlag中都有1,则不会返回所有带0的行。如果WeightRateFlag中没有包含1的行,则将返回所有行


抱歉,原来的问题不清楚-搜索没有帮助,我问了一位同事。我想我的问题可能只是我在这里和搜索中问了一个错误的问题。

看起来有点复杂,但是CTEs非常有用。另外,它们应该与优化器配合得很好。为所需的列进行修改

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)
/* 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
;

请包括一个IE、输入、预期输出和查询到目前为止,并标记RDBMS平台。考虑使用一个联合所有,第一个查询得到1个,第二个查询不包含其中任何一个都有A的记录。1@HLGEM联合所有是什么让我到这一点,费率临时表是联合其他两个表。我没有创建表,也没有编辑能力。大多数WidgetPK都在联盟的第一个表中,少数在第二个表中,但如果他们在第二个表中,他们也在第一个+1表中,这是有效的-我可能需要对它进行微调,因为它的性能受到了影响,但这是在正确的轨道上。很可能你可以在如何创建费率方面做类似的事情。或者,也可以为临时表编制索引。