【问题标题】:SQL Query using Cross Apply to get Sum Conditionally使用交叉应用的 SQL 查询有条件地获取总和
【发布时间】:2015-09-18 09:27:08
【问题描述】:

要产生的输出

将此作为参考,但现在使用不同的场景SQL Server query : get the sum conditionally

解释:

项目、销售和备注列是从数据库中给出的列,新销售列是一个公式化的列,其中除了默认的 n/a 备注外,它获取具有相同关键字备注的项目的总和。

(尽管备注不完全相同,至少有一个共同的相似之处,如上图所示 - 项目 5 中包含“新”,但仍与项目 6 总结,因为它们的相似关键字发现“小")

使用的代码

FIRST OPTION- using partition - 这不起作用,因为当备注彼此不相同时,将无法正确获得总和(对于 item5 和 item6)

 CASE
     WHEN ([remarks] not  like '%big%') AND ([remarks] not  like '%PAENGS%') 


     THEN sales 
     ELSE SUM(sales) OVER(PARTITION BY [remarks])
     END as 'New Sales'

第二个选项 - 使用交叉应用 - 所以它让我这样做,但我迷失了,因为它没有得到所需的输出。

 CROSS APPLY
     SELECT
        d.*, 
        NewSales = 
        CASE
        WHEN ([remarks] not like '%big%') or ([remarks] not like '%small%')
        THEN Sales 
        ELSE x.NewSales
        END


        FROM #MSRSuperFinal3  d
        CROSS APPLY(SELECT NewSales = SUM(Sales)
                    FROM #MSRSuperFinal3 
                    WHERE ([remarks] like  '%big%') or ([remarks] like  '%small%')
        )x

我们将不胜感激任何帮助

【问题讨论】:

  • 你可以添加一些数据而不是图片或给fiddle吗?
  • @wewestthemenace 请帮我解决这个问题

标签: sql sql-server sql-server-2008 cross-apply


【解决方案1】:

使用CROSS APPLY

SELECT *
FROM temp t
CROSS APPLY(
    SELECT SUM(sales)
    FROM temp
    WHERE
        remarks LIKE '%' + t.remarks + '%'
        OR t.remarks LIKE '%' + remarks + '%'
)x(NewSales)
WHERE remarks <> 'n/a'

UNION ALL

SELECT *, 
    NewSales = sales
FROM temp
WHERE remarks = 'n/a'
ORDER BY item

根据您的评论,这应该是您的最终查询:

SELECT * 
FROM #MSRSuperFinal3 t
CROSS APPLY( 
    SELECT 
        SUM(CurrentMonth)
    FROM #MSRSuperFinal3 
    WHERE 
        t.misc LIKE '%' + misc + '%'
        OR misc LIKE '%' + t.misc + '%'
)x(NewSales) 
WHERE 
    ([misc] LIKE '%BIGKAHUNA%') 
    or ([misc] LIKE '%PAENGS%') 

UNION ALL 
SELECT *, 
    NewSales = CurrentMonth 
FROM #MSRSuperFinal3 
WHERE 
    ([misc] not like '%BIGKAHUNA%')
    AND ([misc] not like '%PAENGS%')
    AND ([misc] not like '%ROBINSONS%')
ORDER BY location, name 

【讨论】:

  • 嗨,这里的 temp 代表什么?临时表?
  • 哦,这只是你的桌子的占位符#MSRSuperFinal3
  • 我按照您的代码并根据我的原始列替换了要替换的必要列,但它没有工作。 :(
  • 您可以发布您的查询吗?
  • 首先,我的理解是,第一个使用 cross apply 的查询是获取要计算总和的项目/租户,然后第二个查询将是除了在首先,它们将使用 UNION ALL 进行组合。我修改了一些,因为在实际数据中,它并不总是“N/A”,有些是空白/空,有些只是“na”、“none”等等,所以这是我根据你的代码所做的。
【解决方案2】:

尝试Left Join子句代替Cross Apply:

SELECT a.item,
       a.sales,
       a.remarks,
       CASE
           WHEN a.remarks = 'n/a' 
           THEN a.sales
           ELSE SUM( b.sales )
       END AS [New Sales]
FROM query_using_cross_apply_to_get_sum_conditionally a
LEFT JOIN query_using_cross_apply_to_get_sum_conditionally b 
      ON(a.remarks LIKE '%' + b.remarks + '%'
         AND b.remarks != 'n/a')
GROUP BY a.item, a.sales, a.remarks;

【讨论】:

    【解决方案3】:
    CASE
        WHEN (a.[remarks] <> 'n/a') THEN a.sales 
        ELSE 
        (
            SELECT SUM(b.sales) 
            FROM #MSRSuperFinal3 b
            WHERE b.[remark] LIKE '%' + a.[remarks] + '%'
        )
    END as 'New Sales'
    

    请注意,我只是添加了一个表别名,以便查询知道在哪里使用哪个注释。否则,可能更快的方法是执行公用表表达式,首先对包含彼此的销售额进行求和,因此对于每个唯一的备注,将所有包含在其中的销售额相加,然后在您的最后一个选择中,您只需加入您的公用表表达式表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 2021-03-31
      • 1970-01-01
      相关资源
      最近更新 更多