有关在子查询中使用逻辑的问题

时间:2018-10-23 13:33:45

标签: sql sql-server

我有一个子查询,我想以此为基础根据使用的帐单类型提取客户帐单类型(快速帐单或完整帐单)。目前,我的代码正在提取最近确认的票据类型,但是我想添加一些逻辑以得到期望的结果。

我希望有一些逻辑来确定要显示哪种账单类型。层次结构是我想要完整帐单,如果没有完整帐单,请给我QuickBill1或QuickBill2。

因此,如果客户拥有完整账单和QuickBill1,它将始终显示完整账单。如果客户没有完整帐单,则可以使用QuickBill1或QuickBill2。

ISNULL((SELECT TOP (1)
    cb.Name
FROM CustomerBilling cb WITH(NOLOCK)
    JOIN BillType bt WITH(NOLOCK)
        ON bt.DiagTypeDimID = cb.DiagTypeDimID                                   
WHERE cb.CustomerEventID = d.CustomerEventID --linking this subquery to the main query
     AND bt.DiagType IN ('FullBillName', 'QuickBill1', 'QuickBill2')
     ORDER BY cb.ConfirmedDtm DESC), '**Bill Unavilable**')  AS 
"BillName"

3 个答案:

答案 0 :(得分:0)

您可以将此子查询分为三个单独的子查询,并使用合并代替isull。在第一个子查询中查找最重要的账单类型(FullBillName),依此类推。

<svg xmlns="http://www.w3.org/2000/svg" width="139" height="134">
  <defs>
    <mask id="phase-mask" maskContentUnits="objectBoundingBox">
      <rect x="0.5" y="0" width="0.5" height="1" fill="white"/>
      <ellipse id="phase-ellipse" cx="0.5" cy="0.5" rx="0.2" ry="0.5" fill="white"/>
    </mask>
  </defs>
  <circle fill="black" r="58" cy="69" cx="69"/><!-- moon shadow -->
  <circle fill="#fff" r="54.5" cy="69" cx="69" mask="url(#phase-mask)"/><!-- sunlight on moon -->
  <circle stroke-width="7" stroke="black" fill="none" r="58" cy="69" cx="69"/><!-- moon border -->
</svg>

<p>
<input id="control" type="range" min="0" max="100" value="90" /><span id="output"></span>
</p>

或者您可以定义“帐单类型优先级”-BillType表中的一个字段,并在选择数据时按其排序。

答案 1 :(得分:0)

我认为这可以做到,但是如果没有其余的查询和一些示例数据,就很难确定:

cb.name,
ISNULL(bt.DiagType, '**Bill Unavilable**') AS BillName

FROM CustomerBilling cb
LEFT JOIN BillType bt
  ON bt.DiagTypeDimID = cb.DiagTypeDimID  
  AND cb.CustomerEventID = d.CustomerEventID --linking this subquery to the main query
WHERE bt.DiagType IN ('FullBillName', 'QuickBill1', 'QuickBill2')
ORDER BY cb.ConfirmedDtm,
    CASE bt.DiagType
        WHEN 'FullBillName' THEN 1
        WHEN 'QuickBill1'   THEN 2
        WHEN 'QuickBill2'   THEN 3
        ELSE 9
    END

答案 2 :(得分:0)

如何将优先级逻辑放在ORDER BY中?

SELECT TOP (1) cb.Name
FROM CustomerBilling cb JOIN
     BillType bt 
     ON bt.DiagTypeDimID = cb.DiagTypeDimID                                   
WHERE cb.CustomerEventID = d.CustomerEventID --linking this subquery to the main query AND
       bt.DiagType IN ('FullBillName', 'QuickBill1', 'QuickBill2')
ORDER BY (CASE bt.DiagType WHEN 'FullBillName' THEN 1
                           WHEN 'QuickBill1' THEN 2
                           WHEN 'QuickBill2' THEN 3
          END);