[英]How can I simplify this query without “WITH” or Subquery on SQL server?
我有一個查詢,用於過濾我的表中倉庫和商店中的正庫存。
我只需要取正值,如果其中一個值為正,我就只取這個值。
WITH Resultat AS
(
SELECT AR_Ref,StockDepots,StockStores,
CASE
WHEN StockDepots > 0 AND StockStores > 0 THEN StockDepots + StockStores
WHEN StockDepots > 0 THEN StockDepots
WHEN StockStores > 0 THEN StockStores
ELSE StockDepots + StockStores
END AS StockMulti
FROM ArticleStock
)
SELECT * FROM Resultat
WHERE StockMulti > 0
ORDER BY AR_Ref
小提琴: http : //rextester.com/RMSU6120
我的查詢結果是好的,我需要知道如何在沒有“ WITH”或“子查詢”的情況下簡化此查詢?
編輯**
為什么我不需要WITH或SubQuery是因為在這種情況下我認為是矯kill過正,並且我認為可以在沒有WITH或Subquery的情況下進行此查詢。
CTE或子選擇有什么問題?
以下是一些方法,應該等效:
-使用CROSS APPLY
逐行計算
SELECT AR_Ref,StockDepots,StockStores
,ca.StockMulti
FROM ArticleStock
CROSS APPLY(SELECT CASE
WHEN StockDepots > 0 AND StockStores > 0 THEN StockDepots + StockStores
WHEN StockDepots > 0 THEN StockDepots
WHEN StockStores > 0 THEN StockStores
ELSE StockDepots + StockStores END) AS ca(StockMulti)
WHERE StockMulti > 0
ORDER BY AR_Ref;
--Doubles的CASE
SELECT AR_Ref,StockDepots,StockStores
,CASE
WHEN StockDepots > 0 AND StockStores > 0 THEN StockDepots + StockStores
WHEN StockDepots > 0 THEN StockDepots
WHEN StockStores > 0 THEN StockStores
ELSE StockDepots + StockStores END AS StockMulti
FROM ArticleStock
WHERE CASE
WHEN StockDepots > 0 AND StockStores > 0 THEN StockDepots + StockStores
WHEN StockDepots > 0 THEN StockDepots
WHEN StockStores > 0 THEN StockStores
ELSE StockDepots + StockStores END > 0
ORDER BY AR_Ref;
-如果我做對了,那么檢查WHERE StockStores > 0 OR StockDepots > 0
應該足夠了
SELECT AR_Ref,StockDepots,StockStores
,CASE
WHEN StockDepots > 0 AND StockStores > 0 THEN StockDepots + StockStores
WHEN StockDepots > 0 THEN StockDepots
WHEN StockStores > 0 THEN StockStores
ELSE StockDepots + StockStores END AS StockMulti
FROM ArticleStock
WHERE StockStores > 0 OR StockDepots > 0
ORDER BY AR_Ref;
好吧,你可以這樣做:
SELECT AR_Ref,StockDepots,StockStores,
CASE
WHEN StockDepots > 0 AND StockStores > 0 THEN StockDepots + StockStores
WHEN StockDepots > 0 THEN StockDepots
WHEN StockStores > 0 THEN StockStores
END AS StockMulti
FROM ArticleStock
WHERE StockDepots > 0 or StockStores > 0
ORDER BY AR_Ref
請注意,原始case語句中的“ else”將永遠不會執行,因為您只使用其中一個值大於0的行。我刪除了它,因為這可能會引起混淆。
您可以在以下條件下直接使用:
SELECT AR_Ref,StockDepots,StockStores,
CASE
WHEN StockDepots > 0 AND StockStores > 0 THEN StockDepots + StockStores
WHEN StockDepots > 0 THEN StockDepots
WHEN StockStores > 0 THEN StockStores
ELSE StockDepots + StockStores
END AS StockMulti
FROM ArticleStock
where (CASE
WHEN StockDepots > 0 AND StockStores > 0 THEN StockDepots + StockStores
WHEN StockDepots > 0 THEN StockDepots
WHEN StockStores > 0 THEN StockStores
ELSE StockDepots + StockStores
END) > 0
order by AR_Ref
您可以將數據推送到Temp Table
,然后以一種簡單的方式使用該表。
SELECT AR_Ref,StockDepots,StockStores,
CASE
WHEN StockDepots > 0 AND StockStores > 0 THEN StockDepots + StockStores
WHEN StockDepots > 0 THEN StockDepots
WHEN StockStores > 0 THEN StockStores
ELSE StockDepots + StockStores
END AS StockMulti INTO #Test
FROM #ArticleStock
SELECT * FROM #Test WHERE StockMulti > 0
嘗試這個:
SELECT * FROM
(
SELECT AR_Ref,StockDepots,StockStores,
CASE
WHEN StockDepots > 0 AND StockStores > 0 THEN StockDepots + StockStores
WHEN StockDepots > 0 THEN StockDepots
WHEN StockStores > 0 THEN StockStores
ELSE StockDepots + StockStores
END AS StockMulti
FROM ArticleStock
)
Resultat
WHERE StockMulti > 0
ORDER BY AR_Ref
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.