我有一个子查询,我想以此为基础根据使用的帐单类型提取客户帐单类型(快速帐单或完整帐单)。目前,我的代码正在提取最近确认的票据类型,但是我想添加一些逻辑以得到期望的结果。
我希望有一些逻辑来确定要显示哪种账单类型。层次结构是我想要完整帐单,如果没有完整帐单,请给我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"
答案 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);