【问题标题】:SQL Select invoice data, group by date and order by highest salesSQL选择发票数据,按日期分组并按最高销售额排序
【发布时间】:2021-06-12 16:21:38
【问题描述】:

我正在尝试编写一个 SQL 语句,该语句应该为一年中的每一周提供一行,其中包含该周的发票总额以及所有价格的总和。

发票数据存储在 2 个表中:1 个用于发票,1 个用于每个发票的数据。它看起来像这样(简化):

发票:

Id | inv_date   |
---+------------|
11 | 2021-03-01 |
12 | 2021-03-01 |
13 | 2021-03-01 |
14 | 2021-03-02 |
...

发票位置:

Invoice_Id | position | article_no | amount | price  |
-----------+----------+------------+--------+--------|
11         | 1        | 12345      | 1      |  12.95 |
12         | 1        | 23456      | 1      |  22.99 |
12         | 2        | 23457      | 5      |   3.95 |
13         | 1        | 12345      | 2      |  12.95 |
14         | 1        | 98765      | 1      | 199.95 |
...

所以我的目标是这样的:

year | week | amount_invoices | sales_total|
-----+------+-----------------+------------|
2020 | 51   | 100             | 4500.91    |
2020 | 52   |  90             | 4200.50    |
2020 | 53   |  85             | 4155.55    |
2021 |  1   |  88             | 4280.81    |
2021 |  2   | 105             | 4812.85    |
2021 |  3   | 112             | 4722.94    |
...

我不是 SQL 专家,所以到目前为止,我所拼凑的只是获取所有年份和每个星期的列表。我还尝试包括发票金额和总销售额,但是这 2 列以我的方式返回错误值……发票金额太高,销售额也下降了。 我当前的 SQL 如下所示:

SELECT 
    DATEPART(year, i.inv_date) as year,
    DATEPART(week, i.inv_date) as week,
    COUNT(i.id) as amount_invoices,
    SUM(p.price) as sales_total
FROM
    invoices i
JOIN
    invoice_positions p ON i.id = p.invoice_id 
GROUP BY 
    DATEPART(week, i.inv_date), DATEPART(year, i.inv_date)
ORDER BY
    year DESC, week DESC

如果有人能指出我正确的方向,那就太好了!

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。

标签: sql function date join group-by


【解决方案1】:

发票数量已关闭,因为您正在加入件数部分,因此COUNT() 确实在计算件数。

另一方面,根据问题中的信息,总金额应该是正确的。你可以先用COUNT(DISTINCT)解决第一个问题:

SELECT DATEPART(year, i.inv_date) as year,
       DATEPART(week, i.inv_date) as week,
       COUNT(DISTINCT i.id) as amount_invoices,
       SUM(p.price) as sales_total
FROM invoices i JOIN
     invoice_positions p
     ON i.id = p.invoice_id 
GROUP BY DATEPART(week, i.inv_date), DATEPART(year, i.inv_date)
ORDER BY year DESC, week DESC;

【讨论】:

  • 哦,哇,我猜我已经接近了。毕竟总金额是正确的,但是当我将它与我手头的结果进行比较时,我混淆了这些行。那么 DISTINCT 就可以了,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-10
  • 2021-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-04
相关资源
最近更新 更多