クエリの AND ステートメントで 3 回リストする必要があるかなり大きな SQL 式を扱っています。読みやすさを向上させるために、式を変数に設定し、それを 3 回参照するだけにします。しかし、私はこれを進めるのに苦労しています。たとえば、BEGIN SET … END を試してみましたが、BEGIN ブロックには無効な場所のようです。最上位のクエリ項目 (LowPrice) も参照しようとしましたが、認識されませんでした。
クエリは次のとおりです。
SELECT cl.claimid, cl.GUID1 AS [GUID1], cl.GUID2 AS [GUID2]
,cs.Conclusion AS [ClaimStatus]
,CASE [Type] WHEN 0 THEN 'a' + REPLACE(STR(Precedence,5),' ','0') ELSE 'b' + REPLACE(STR(Precedence,5),' ','0') END TransactionNumber
,tr.TradeDate AS [TradeDate]
,REPLACE(CONVERT(varchar(16),cast(Shares as money),1), ',', '') AS [Shares]
,tr.PricePerShare AS [Price]
,CASE WHEN tr.Custom IS NULL THEN '' ELSE tr.Custom END AS [ML]
,ISNULL((SELECT TOP 1 LowPrice FROM ca_historical_sec h
WHERE caseId = @caseid AND [Security] = 'Common Stock' AND h.TradeDate = tr.TradeDate
ORDER BY tradeDate DESC),0) AS LowPrice
,ISNULL((SELECT TOP 1 HighPrice FROM ca_historical_sec h
WHERE caseId = @caseid AND [Security] = 'Common Stock' AND h.TradeDate = tr.TradeDate
ORDER BY tradeDate DESC),0) AS HighPrice
,CASE HasProof WHEN 1 THEN 'HAS PROOF' ELSE 'NO PROOF' END HasProof
FROM ca_claim cl
CROSS APPLY (
--Get all fields of the top row
SELECT TOP 100 PERCENT *
FROM ca_transaction_sec tr
WHERE tr.claimId = cl.claimid
AND tr.type < 2
AND (PricePerShare > 0 AND PricePerShare NOT BETWEEN
(
--- Trying to do it here ----
--BEGIN SET @ThePrice = ISNULL((SELECT TOP 1 LowPrice FROM ca_historical_sec h WHERE caseId = @caseid AND h.tradeDate = tr.tradeDate AND [Security] = 'Common Stock' ORDER BY h.tradeDate DESC),0) END
CASE WHEN @MarginType = 'Percent' THEN ISNULL((SELECT TOP 1 LowPrice FROM ca_historical_sec h WHERE caseId = @caseid AND h.tradeDate = tr.tradeDate AND [Security] = 'Common Stock' ORDER BY h.tradeDate DESC),0) - (ISNULL((SELECT TOP 1 LowPrice FROM ca_historical_sec h WHERE caseId = @caseid AND h.tradeDate = tr.tradeDate AND [Security] = 'Common Stock' ORDER BY h.tradeDate DESC),0) * @percentMargin)
ELSE ISNULL((SELECT TOP 1 LowPrice FROM ca_historical_sec h WHERE caseId = @caseid AND h.tradeDate = tr.tradeDate AND [Security] = 'Common Stock' ORDER BY h.tradeDate DESC),0) - @dollarMargin END
)
AND
(
--Ideally this would be something like:
BEGIN SET @HighPrice = .... END
CASE WHEN @MarginType = 'Percent' THEN @HighPrice + (@HighPrice * @percentMargin)
ELSE @HighPrice + @dollarMargin END
)
)
AND (@caseid <> 177
OR (@caseid = 177 AND 0 = 0 AND ISNULL(tr.custom,'') in ('',' ','D'))
OR (@caseid = 177 AND 0 = 1 AND tr.custom = 'A'))
order by tr.createdon
) tr
LEFT OUTER JOIN ca_ClaimStatus cs ON cl.claimid = cs.claimid
WHERE cl.caseId = @caseid
ご覧のとおり、ISNULL((SELECT TOP 1 LowPrice FROM ca_historical_sec h WHERE caseId = @caseid AND h.tradeDate = tr.tradeDate AND [Security] = 'Common Stock' ORDER BY h.tradeDate DESC),0)
は非常に長い式です。また、CROSS APPLY の前にクエリ項目の 1 つとして既にリストされています。その値に等しい変数を設定したいと思います。CROSS APPLYを維持しながらこれを行う方法はありますか?