要制作的输出
使用此作为参考,但现在使用不同的方案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
任何帮助都将受到高度赞赏
答案 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的所有销售,然后在你的上一次选择中你只需加入你的公用表表达式表。