E.R*_*nim 1 performance sql-server query-performance
你好朋友我正在研究一个从数据库中绘制数据的模块,问题是我必须首先绘制一系列通过数学公式的数据。到目前为止没问题,但我必须从一年中的几个月中获取数据,因此我必须重复这个过程十二次。我的真实问题是这样的:
我怎样才能让每个响应只有一行一行?
如果我尝试这样的事情......
DECLARE @cnt INT = 0;
WHILE @cnt < 12
BEGIN
select idestatus from order
SET @cnt = @cnt + 1;
END;
Run Code Online (Sandbox Code Playgroud)
我将执行 12 个查询和 12 个表而我只需要一个。我最终会将其转换为json,因此我希望将所有内容都放在一个响应表中。这是我的查询:
declare
@a decimal(5,2) = 0,
@d decimal(5,2) = 0,
@f1 decimal(5,2) = 0,
@f2 decimal(5,2) = 0
set
@a = (
select
COUNT(idEstatus) A_D
from t1
where (year(dat)) = 2017 and (month(dat)) = 1
and idEstatus = 2
)
set
@d = (
COUNT(idEstatus) A_D
from t1
where (year(dat)) = 2017 and (month(dat)) = 1
and idEstatus = 3
)
set @f1 =
(
select
COUNT(idEstatus) A_D
from t1
where (year(dat)) = 2017 and (month(dat)) = 1
and idEstatus = 2
)
set @f2 =
(
COUNT(idEstatus) A_D
from t1
where (year(dat)) = 2017 and (month(dat)) = 1
and idEstatus = 3
)
select
(((@a + @d)/2) *100)/((@f1 + @f2)/ 2) rf
Run Code Online (Sandbox Code Playgroud)
如果也有人能告诉我如何通过UNION订购它,那可能真的很有用。
您可以使用此示例简化上面的查询,但由于我们不了解您的表的架构以及您的最终目标是什么,它会受到一些限制。
这应该一步完成您的查询,但它具有硬编码的 idEstatus 值(这可能没问题)并且限制为一个月。
不清楚您的示例查询是否真的需要下半年,因为它似乎是同一日期(如果您想要年复一年,那么正确答案是不同的)。
;WITH CTE_Details AS
(
SELECT YEAR(dat) AS [year]
, MONTH(dat) AS [month]
, idEstatus_Count_2 = CAST(COALESCE(SUM(CASE WHEN idEstatus = 2 THEN 1 ELSE 0 END), 0) AS DECIMAL(5,2))
, idEstatus_Count_3 = CAST(COALESCE(SUM(CASE WHEN idEstatus = 3 THEN 1 ELSE 0 END), 0) AS DECIMAL(5,2))
FROM t1
WHERE idEstats IN (2,3)
AND dat BETWEEN CAST('1/1/2017' AS DATETIME) AND CAST('1/31/2018 11:59:59 PM' AS DATETIME)
GROUP BY YEAR(dat)
, MONTH(dat)
)
SELECT [year]
, [month]
, idEstatus_Count_2
, idEstatus_Count_3
, rf = (((idEstatus_Count_2 + idEstatus_Count_3) / 2.0) * 100) / ((idEstatus_Count_2 + idEstatus_Count_3) / 2.0)
FROM CTE_Details
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1666 次 |
最近记录: |