SQL 按年份分组给出不正确的结果

Posted

技术标签:

【中文标题】SQL 按年份分组给出不正确的结果【英文标题】:SQL Grouping by year gives incorrect results 【发布时间】:2021-03-26 13:03:46 【问题描述】:

我正在尝试按月、销售区域和类型汇总销售日期。问题是,当我尝试按年份分组时,结果会发生变化。

我的简化查询如下:

SELECT
DAB700.DATUM,DAB000.X_REGION,DAB700.BELEG_ART, // the date, sales region, order type
   // calculate the number of orders per month
   COUNT (DISTINCT CASE WHEN MONTH(DAB700.DATUM) =  1 THEN DAB700.BELEG_NR END) as jan,
   COUNT (DISTINCT CASE WHEN MONTH(DAB700.DATUM) =  2 THEN DAB700.BELEG_NR END) as feb,
   COUNT (DISTINCT CASE WHEN MONTH(DAB700.DATUM) =  3 THEN DAB700.BELEG_NR END) as mar
FROM "DAB700.ADT" DAB700
left join "DAB050.ADT" DAB050 on DAB700.BELEG_NR = DAB050.ANUMMER // join to table 050, to pull in order info
left join "DF030000.DBF" DAB000 on DAB050.KDNR = DAB000.KDNR // join table 000 to table 050, to pull in customer info
left join "DAB055.ADT" DAB055 on DAB050.ANUMMER = left (DAB055.APNUMMER,6)// join table 055 to table 050, to pull in product info
WHERE (DAB700.BELEG_ART = 10 OR DAB700.BELEG_ART = 20) AND (DAB700.DATUM>=d '2021-01-01') AND (DAB700.DATUM<=d '2021-01-11') AND DAB055.ARTNR <> '999999' AND DAB055.ARTNR <> '999996' AND DAB055.TERMIN <> 'KW.22.22' AND DAB055.TERMIN <> 'KW.99.99' AND DAB050.AUF_ART = 0
group by DAB700.DATUM,DAB000.X_REGION,DAB700.BELEG_ART   

这会返回以下数据,这是正确的(手动检查):

| DATUM      | X_REGION | BELEG_ART | jan | feb | mar |
|------------|----------|-----------|-----|-----|-----|
| 04.01.2021 | 1        | 10        | 3   | 0   | 0   |
| 04.01.2021 | 3        | 10        | 2   | 0   | 0   |
| 04.01.2021 | 4        | 10        | 1   | 0   | 0   |
| 04.01.2021 | 4        | 20        | 1   | 0   | 0   |
| 04.01.2021 | 6        | 20        | 2   | 0   | 0   |
| 05.01.2021 | 1        | 10        | 1   | 0   | 0   |
and so on....

一月的记录总数为 117(正确)。

现在我想汇总一行中的数据(例如,按地区和类型分组的数据)..

所以我改变了我的代码,这样我就有了:

SELECT
YEAR(DAB700.DATUM),

group by YEAR(DAB700.DATUM)

其余代码保持不变。

现在我的结果是:

| EXPR | X_REGION | BELEG_ART | jan | feb | mar |
|------|----------|-----------|-----|-----|-----|
| 2021 | 1        | 10        | 16  | 0   | 0   |
| 2021 | 1        | 20        | 16  | 0   | 0   |
| 2021 | 2        | 10        | 19  | 0   | 0   |
| 2021 | 2        | 20        | 22  | 0   | 0   |
| 2021 | 3        | 10        | 12  | 0   | 0   |
| 2021 | 3        | 20        | 6   | 0   | 0   |

视觉上是正确的。但是,一月份的总数现在是 116。相差 1。我做错了什么?

如何保留第一个代码的结果 - 但它是否按照第二个集合呈现?

【问题讨论】:

【参考方案1】:

你算不同 BELEG_NR。这就是与众不同的地方。让我们看一个例子。假设您的表包含四行:

DATUM X_REGION BELEG_ART BELEG_NR
04.01.2021 1 10 100
04.01.2021 1 10 200
05.01.2021 1 10 100
05.01.2021 1 10 300

这为您提供每天、地区和 belegart:

DATUM X_REGION BELEG_ART DISTINCT COUNT BELEG_NR
04.01.2021 1 10 2
05.01.2021 1 10 2

每年,地区和贝莱加特

YEAR X_REGION BELEG_ART DISTINCT COUNT BELEG_NR
2021 1 10 3

BELEG_NR 100 每天不会出现超过一次,因此每个实例都会被计算在内。但它在一年中出现两次,因此只计算一次而不是两次。

【讨论】:

您好,Thorsten,谢谢!你的解释很有道理。我需要详细检查数据,看看是否合适。如果是这样,在一行(每个地区和类型)上显示每月唯一订单的解决方案是什么?有什么建议吗? 嗯,似乎一个beleg_nr 可以关联多个datum。所以问题是:从商业角度来看,这意味着什么?你应该数还是不数?一个解决方案可能是根本不计算不同的。或者只计算每个beleg_nr 的第一个datum。或者计算不同的datum + beleg_nr...我当然不能回答这个问题。 啊好主意 - 我认为选择第一个日期,对于任何 beleg_nr 都是最好的解决方案,然后计算那些......我会将问题标记为已回答!

以上是关于SQL 按年份分组给出不正确的结果的主要内容,如果未能解决你的问题,请参考以下文章

如何按月份或年份计数和分组,月份为零

我需要一些关于 SQL Sum 函数按日期和组分组的帮助

LINQ - 按多个键分组未给出预期结果

SQL: 一般情况按年分组,特殊年份按指定日期分组,SELECT语句怎么写?

检索按类别分组的 SQL 结果

Pyspark orderBy 在对多列进行排序时给出不正确的结果