【发布时间】:2019-02-21 13:40:17
【问题描述】:
这只是我完整查询的一小部分
我有一些数据正在使用聚合和子查询计算今年和去年(很多其他事情)的值。
下面是我的查询的工作和最简单的版本:
SELECT distinct
t1.country,
t1.manufacturer,
t1.category,
t1.month,
t1.year,
(SELECT SUM(value) FROM data ----- value is the column name which i want to aggregate
WHERE mar_short_desc = t1.mar_short_desc
AND category = t1.category
AND manufacturer = t1.manufacturer
AND month = t1.month
AND year = t1.year ----- This Is the only difference Filter
) AS Company_TY,
(SELECT SUM(value) FROM data
WHERE mar_short_desc = t1.mar_short_desc
AND category = t1.category
AND manufacturer = t1.manufacturer
AND month = t1.month
AND year = t1.year -1 ----- This Is the only difference Filter
) AS Company_LY,
FROM data t1
----- Other filters are here ignored for simplicity
) a
我想优化它。因此尝试将两个子查询合并为一个并使用“case”语句来计算相同的值。
这是修改后的版本:
SELECT distinct
t1.country,
t1.manufacturer,
t1.category,
t1.month,
t1.year,
(SELECT SUM(CASE WHEN year = t1.year THEN value END) AS Company_TY,
SUM(CASE WHEN year = t1.year -1 THEN value END) AS company_LY
FROM data
WHERE mar_short_desc = t1.mar_short_desc
AND category = t1.category
AND manufacturer = t1.manufacturer
AND month = t1.month
)
FROM data t1
) a
这给了我错误:“在一个 包含外部引用的聚合表达式。如果一个表达式 被聚合包含一个外部引用,然后那个外部 reference 必须是表达式中唯一引用的列。"
我要做的就是制作一个包含所有常见过滤器的框架,然后使用唯一过滤器聚合该结果(原因:所以我不必一次又一次地过滤相同的东西。它是一个大代码和很多数据如此,要优化)
【问题讨论】:
-
MAX 和 SUM 不是一回事。您可以通过将示例数据和预期输出作为文本添加到问题中来改进此问题。
-
你的第二个查询真的优化了吗?如果数据库中有 15 年的数据怎么办?您可能必须扫描所有 15 年并丢弃其中的 13 年。
-
@P.Salmon 也更新了上面的 SUM()。我想要从第一个查询中得到的结果。它是一个简单的 Over + partion By + 另一个过滤器,在该过滤器中获得了去年同月的值。值得一提的是,这只是 8000 行查询中的一部分,其中包含 10GB 数据和 20 列。
-
选择
DISTINCT a, b然后使用相同的列进行相关子查询是很奇怪的。至少第一个子查询似乎是不必要的。 -
@WillisBlackburn 当我有 10 GB 的数据并且我必须为每一行执行这些过滤器并且必须通过这样的子查询 20 次(没有任何其他方式〜或者我不知道学习阶段)我认为它的一次过滤和计算比做同样的 20 次更好。有关如何解决此参考问题的任何建议?
标签: sql sql-server case correlated-subquery