[英]How can I simplify this query without “WITH” or Subquery on SQL server?
I've a query that filter my table for positive stock in my warehouse and stores. 我有一个查询,用于过滤我的表中仓库和商店中的正库存。
I need to take only positive value and if one of values is positive I take this value only. 我只需要取正值,如果其中一个值为正,我就只取这个值。
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
Fiddle : http://rextester.com/RMSU6120 小提琴: http : //rextester.com/RMSU6120
My query result is Ok, I need to know How can I simplify this query without "WITH" or Subquery ? 我的查询结果是好的,我需要知道如何在没有“ WITH”或“子查询”的情况下简化此查询?
EDIT** 编辑**
Why I don't need WITH or SubQuery is because I think is overkill in this case and I think it's possible to make this query without WITH or Subquery. 为什么我不需要WITH或SubQuery是因为在这种情况下我认为是矫kill过正,并且我认为可以在没有WITH或Subquery的情况下进行此查询。
What's wrong with a CTE or a sub-select? CTE或子选择有什么问题?
Here are some approaches, which should be equivalent: 以下是一些方法,应该等效:
--Uses row-wise calculation with CROSS APPLY
-使用
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 the CASE
--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;
--If I get this right, it should be enough to check for WHERE StockStores > 0 OR StockDepots > 0
-如果我做对了,那么检查
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;
Well, you could do this: 好吧,你可以这样做:
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
Note that the "else" in the original case statement would never get exercised, because you are only using rows where one of the values is > 0. I removed it, as it may cause confusion. 请注意,原始case语句中的“ else”将永远不会执行,因为您只使用其中一个值大于0的行。我删除了它,因为这可能会引起混淆。
You can use directly in where condition: 您可以在以下条件下直接使用:
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
You can push the data into a Temp Table
and then later use that table in a simple way. 您可以将数据推送到
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
Try this: 尝试这个:
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.