【问题标题】:SQL Server calculation or metric using aggregates使用聚合的 SQL Server 计算或度量
【发布时间】:2023-03-22 07:47:01
【问题描述】:

我在 SQL Server 中有一个问题,我不知道如何解决。从下面的查询和输出中,我需要生成以下指标:尺寸级别的 ATP(可承诺)以百分比表示,即:

  1. 有 3 种尺寸,2 种有数量 - 1 种没有。如果有任何数量,那么如果不是“0”,我想返回值“1”(CASE 语句)

  2. 留下 2 的值为 '1' 和 1 的值为 '0' (2/3) 或 66% 'Full Size ATP'

如何使用下面的查询生成该计算?我在CASE 语句上尝试了COUNT,但没有成功。

感谢您的帮助。

查询:

    SELECT A.MATERIAL, 
       M.SIZE_LITERAL, 
       DATEPART(mm,AVAIL_DATE) AS 'MONTH',
      CASE 
            WHEN A.AVAIL_QTY IS NULL 
            THEN '0'
            ELSE A.AVAIL_QTY
       END AS 'AVAIL_QTY', 
      COUNT(AVAIL_QTY) AS 'COUNT_ATP_QTY',
      COUNT(AVAIL_QTY)/COUNT(*) AS 'ATP %'
FROM   VW_MM_SALES_GRID M LEFT OUTER JOIN VW_ATP_DOWNLOAD_NOREQCAT A 
    ON A.MATERIAL = M.MATERIAL 
    AND A.SIZE_LITERAL = M.SIZE_LITERAL
    AND A.STOCK_CATEGORY IN ('A60381000','A60382000')
    AND A.AVAIL_DATE BETWEEN GETDATE() AND GETDATE() + 90

WHERE  M.MATERIAL = 'AA2721' AND  M.ACTIVE_FLAG IS NOT NULL

GROUP BY A.MATERIAL, 
         M.SIZE_LITERAL, 
         AVAIL_DATE, 
         A.AVAIL_QTY,
         A.STOCK_CATEGORY

SELECT @@ROWCOUNT

结果:

MATERIAL           SIZE_LITERAL MONTH       AVAIL_QTY                               COUNT_ATP_QTY ATP %
------------------ ------------ ----------- --------------------------------------- ------------- -----------
NULL               S            NULL        0                                       0             0
AA2721             L            8           45                                      1             1
AA2721             M            8           51                                      1             1
Warning: Null value is eliminated by an aggregate or other SET operation.

(3 row(s) affected)


-----------
3

(1 row(s) affected)

【问题讨论】:

    标签: sql sql-server count rowcount


    【解决方案1】:

    应该这样做 - 您需要在结果中为每种材料获取一行,因为您正在计算聚合 (ATP),并且 NULL 不会被计算在内,因此您不需要使用 CASE,您可以只计算非 NULL 并除以总数。

    SELECT COUNT(NULLIF(A.AVAIL_QTY, 0)) / COUNT(*) * 100 AS [Full Size ATP]
    FROM VW_MM_SALES_GRID M LEFT OUTER JOIN VW_ATP_DOWNLOAD_NOREQCAT A 
        ON A.MATERIAL = M.MATERIAL 
        AND A.SIZE_LITERAL = M.SIZE_LITERAL
        AND A.STOCK_CATEGORY IN ('A60381000','A60382000')
        AND A.AVAIL_DATE BETWEEN GETDATE() AND GETDATE() + 90
    WHERE  M.MATERIAL = 'AA2721' AND  M.ACTIVE_FLAG IS NOT NULL
    

    【讨论】:

    • 感谢您的帮助!下面的结果似乎不是我想要得到的结果:
    • 材料全尺寸 ATP ------ ------------- AA2721 0 警告:空值是通过聚合或其他 SET 操作消除。 (1 行受影响)
    • 道歉 cmets 似乎不喜欢输出,但我得到了 0 的值和警告再次感谢!
    • 我在查询中添加了 COUNT(A.MATERIAL) 和 COUNT(*) 以查看它们返回的内容。我在查询中使用了 A.MATERIAL,因为我假设如果您要加入该列,那么当 A.AVAIL_QTY 不为空时它不应该为空,并且基于您的问题 A.AVAIL_QTY 不为空。没有看到你的数据很难说。
    • 感谢您的帮助 - 我已经更新了上面的问题。在此,我在 AVAIL_QTY 上使用 COUNT 来获取值 1 或 0。在第二部分中,我使用 @@ROWCOUNT 来获取此材料的总行数。我想做的是对 2 的 COUNT 进行求和,然后除以 3 的 ROWCOUNT ......抱歉有任何混淆,再次感谢您。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    • 2017-04-26
    • 1970-01-01
    相关资源
    最近更新 更多