SQL 使用交叉应用查询以有条件地获取总和
SQL Query using Cross Apply to get Sum Conditionally
要产生的输出
使用此作为参考,但现在使用不同的场景
解释:
Item, Sales, and remarks columns are given column from a database, New Sales column is a formulated column where, it is getting the sum of items with the same keyword remarks except the default n/a 备注.
(尽管备注不完全相同,但至少有一个共同的相似性,如上图 - 项目 5 中有 "new",仍然与项目 6 总结,因为它们相似找到关键字 "small")
使用代码
第一个选项-使用分区-这不起作用,因为当备注彼此不相同时,它将无法正确获得总和(对于项目 5 和项目 6)
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
任何帮助将不胜感激
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'
请注意,我刚刚添加了一个 table 别名,以便查询知道在何处使用哪个注释。否则可能更快的事情是做一个 Common table 表达式,首先对包含彼此的销售额求和,所以对于每个独特的评论求和包含在中的所有销售额,然后在你的最后一个 select你 cna 只是加入你的共同 table 表达式 table.
尝试 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;
使用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
要产生的输出
使用此作为参考,但现在使用不同的场景
解释:
Item, Sales, and remarks columns are given column from a database, New Sales column is a formulated column where, it is getting the sum of items with the same keyword remarks except the default n/a 备注.
(尽管备注不完全相同,但至少有一个共同的相似性,如上图 - 项目 5 中有 "new",仍然与项目 6 总结,因为它们相似找到关键字 "small")
使用代码
第一个选项-使用分区-这不起作用,因为当备注彼此不相同时,它将无法正确获得总和(对于项目 5 和项目 6)
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
任何帮助将不胜感激
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'
请注意,我刚刚添加了一个 table 别名,以便查询知道在何处使用哪个注释。否则可能更快的事情是做一个 Common table 表达式,首先对包含彼此的销售额求和,所以对于每个独特的评论求和包含在中的所有销售额,然后在你的最后一个 select你 cna 只是加入你的共同 table 表达式 table.
尝试 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;
使用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