【问题标题】:Split a grand total value into two columns in SQL Server在 SQL Server 中将总计值拆分为两列
【发布时间】:2019-10-09 05:33:10
【问题描述】:

我试图在我的查询中将“总计”值拆分为两列,但这样做是通过在结果中保留一行来实现的。我目前正在使用两个不同的CASE 语句来执行此操作,但它最终会为每个结果创建两行——每行包含一个NULL。有没有办法做到这一点,只返回一行结果,总和按指定的条件分开?

例如,我有一种材料,其“空白数量”为 38 个单位,“未覆盖数量”为 8 个单位,总计 46 个。我希望在一行中看到这一点 - 但代码如下我为这种材料获得了两行 - 每种类型的数量各一行。我已经研究过PIVOT,但似乎不会奏效。

CASE
        WHEN MRP.STOCK_TYPE = 'A'
        THEN SUM(MRP.QUANTITY) 
        END AS 'Uncovered Qty', 
    CASE WHEN MRP.STOCK_TYPE <> 'A'
        THEN SUM(MRP.QUANTITY)
        END AS 'Blank Qty'

返回:

值为“未覆盖数量”= NULL 和“空白数量”= 38 的一行 一行值为 'uncovered qty = 8 和 'blank qty = NULL

有没有办法让它在一行中返回并避免NULL

【问题讨论】:

  • 基于 有没有办法让它在单行中返回并避免 NULL -> where your_column IS NOT NULL
  • CASE 不是一个语句,它是一个返回标量值的表达式。如果您的起点是需要合并(可能)或过滤的 2 行(或更多 - 我们不知道),那么适当的逻辑取决于您的目标和这些行的内容。您已经在使用 SUM - 这意味着您已经在对行进行分组,因此问题很可能出在未发布的分组逻辑上。你有猜测,但猜测并不是找到解决方案的最有效方法。

标签: sql sql-server case


【解决方案1】:

您可以将条件带入SUMs,这将在一行中为您提供两个值:

SUM (CASE WHEN MRP.STOCK_TYPE  = 'A' THEN MRP.QUANTITY ELSE 0 END) AS 'Uncovered Qty', 
SUM (CASE WHEN MRP.STOCK_TYPE <> 'A' THEN MRP.QUANTITY ELSE 0 END) AS 'Blank Qty'

【讨论】:

  • 这就是我要做的 - 使用 groupby 来扩展该技术也很容易产生枢轴。如果你喜欢,ELSE 0 可以省略
  • @CaiusJard 我想把它放进去只是为了清楚起见,也以防万一有一个 DBMS 不喜欢对 NULL 值求和。
【解决方案2】:

在您的子查询中添加 isnull() 以返回 0 表示空值,sum() 再次返回结果。

select sum(t1.[Uncovered Qty]) as [Uncovered Qty], sum(t1.[Blank Qty]) as [Blank Qty]
from (select 
        CASE WHEN MRP.STOCK_TYPE = 'A'
        THEN ISNULL(SUM(MRP.QUANTITY), 0) 
        END AS 'Uncovered Qty', 

        CASE WHEN MRP.STOCK_TYPE <> 'A'
        THEN ISNULL(SUM(MRP.QUANTITY), 0)
        END AS 'Blank Qty'
        from table) t1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-02
    • 2011-11-23
    相关资源
    最近更新 更多