查询中的 for 循环 - 如何使用 Union?

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订购它,那可能真的很有用。

Jon*_*ite 5

您可以使用此示例简化上面的查询,但由于我们不了解您的表的架构以及您的最终目标是什么,它会受到一些限制。

这应该一步完成您的查询,但它具有硬编码的 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)