SQL Query使用Cross Apply有条件地获得Sum

时间:2015-07-01 09:33:57

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

要制作的输出

enter image description here

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

解释

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

(无论评论是否完全相同,至少有一个常见的相似之处,如上图所示 - 第5项有"新"在其中,仍与项目6相加因为找到了相似的关键字" small")

使用的代码

第一个选项 - 使用分区 - 这不起作用,因为当备注彼此不相同时,它将无法正确获得总和(对于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

任何帮助都将受到高度赞赏

3 个答案:

答案 0 :(得分: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 

答案 1 :(得分:0)

尝试左连接子句而不是交叉应用:

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;

答案 2 :(得分:-1)

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'

请注意,我刚添加了一个表别名,以便查询知道在哪里使用哪个备注。否则可能更快的事情就是做一个Common表表达式并首先为包含彼此的销售做一笔总和,因此对于每个唯一的备注总和,包含in的所有销售,然后在你的上一次选择中你只需加入你的公用表表达式表。