SQL-查询无效,因为聚合函数对每个日期和ID进行简单计算

SQL-查询无效,因为聚合函数对每个日期和ID进行简单计算,sql,join,aggregate-functions,Sql,Join,Aggregate Functions,我对SQL非常陌生(不到100小时)。问题案例如下所述。每次我尝试查询时,要么得到不正确的输出,要么出现“未包含在聚合函数或GROUP BY子句中”的错误 尝试搜索类似的问题或示例,但没有结果。我现在迷路了。 请帮忙 我有三张桌子 表Calc Source_id | date(yyyymmdd) | metric1 | metric 2 ------------------------------------------------- 1 | 20201010 | 2

我对SQL非常陌生(不到100小时)。问题案例如下所述。每次我尝试查询时,要么得到不正确的输出,要么出现“未包含在聚合函数或GROUP BY子句中”的错误 尝试搜索类似的问题或示例,但没有结果。我现在迷路了。 请帮忙

我有三张桌子

表Calc

Source_id | date(yyyymmdd) | metric1 | metric 2
-------------------------------------------------
1         | 20201010       | 2       | 3 
2         | 20201010       | 4       | 5 
3         | 20201010       | 6       | 7 
1         | 20201011       | 8       | 9 
2         | 20201011       | 10      | 11 
3         | 20201011       | 12      | 13 
1         | 20201012       | 14      | 15 
2         | 20201012       | 16      | 17 
3         | 20201012       | 18      | 19

表源


Source_id | Description
------------------------
1          | ABC
2          | DEF
3          | XYZ

表系数


Date     | Factor
-----------------
20201010 | .3
20201011 | .5
20201012 | .7

如果用户选择的日期为20201010至20201012,则结果将为


Source_id    |   Calculated Value
-------------------------------------------------------------------------------
ABC          | ((2x3)x.3+(8x9)x.5)/2
DEF          | ((4x5)x.3+(10x11)x.5)/2
XYZ          | ((6x7)x.3+(12x13)x.5)/2


Source_id    |   Calculated Value
-------------------------------------------------------------------------------
ABC          | (14x15)x.7
DEF          | (16x17)x.7
XYZ          | (18x19)x.7

要求的结果


Source_id    |   Calculated Value
-------------------------------------------------------------------------------
ABC          | (((2x3)x.3 + (8x9)x.5 + (14x15)x.7))/(No of dates selected in this case =3)
DEF          | (((4x5)x.3+ (10x11)x.5 + (16x17)x.7))/(No of dates selected in this case =3)
XYZ          | (((6x7)x.3+ (12x13)x.5 + (18x19)x.7))/(No of dates selected in this case =3)

日期将是用户定义的输入,因此计算值应为许多日期的平均值。所选日期将始终在范围内定义,而不是随机多个选择

在表calc中,源id和日期将是唯一的。 每个日期都有一个系数,该系数将与该日期的所有源id相乘

若用户选择的日期为20201010至20201011,则结果为


Source_id    |   Calculated Value
-------------------------------------------------------------------------------
ABC          | ((2x3)x.3+(8x9)x.5)/2
DEF          | ((4x5)x.3+(10x11)x.5)/2
XYZ          | ((6x7)x.3+(12x13)x.5)/2


Source_id    |   Calculated Value
-------------------------------------------------------------------------------
ABC          | (14x15)x.7
DEF          | (16x17)x.7
XYZ          | (18x19)x.7

如果用户选择的日期为20201012,则结果将为


Source_id    |   Calculated Value
-------------------------------------------------------------------------------
ABC          | ((2x3)x.3+(8x9)x.5)/2
DEF          | ((4x5)x.3+(10x11)x.5)/2
XYZ          | ((6x7)x.3+(12x13)x.5)/2


Source_id    |   Calculated Value
-------------------------------------------------------------------------------
ABC          | (14x15)x.7
DEF          | (16x17)x.7
XYZ          | (18x19)x.7


创建CTE以存储开始和结束日期,并将其交叉连接到表的连接,按源分组和聚合:

WITH cte AS (SELECT '20201010' min_date, '20201012' max_date)
SELECT s.Description,
       ROUND(SUM(c.metric1 * c.metric2 * f.factor / (DATEDIFF(day, t.min_date, t.max_date) + 1)), 2) calculated_value
FROM cte t CROSS JOIN Source s 
LEFT JOIN Calc c ON c.Source_id = s.Source_id AND c.date BETWEEN t.min_date AND t.max_date
LEFT JOIN Factor f ON f.date = c.date
GROUP BY s.Source_id, s.Description
请参阅。
结果:


这个计算毫无意义。该系数似乎应用于日期级别,但所有三行的日期都相同。因此,不清楚在计算中如何确定系数。@GordonLinoff校正完成。