【发布时间】:2021-04-27 05:11:00
【问题描述】:
我正在尝试创建一个 openAR 文件,但我一直在尝试按客户和发票对这些数据进行分组。该文件将每天创建。
| [FILE DATE] | [CUSTOMER ID] | [INVOICE NUMBER] | [INVOICE TYPE] | [INVOICE DATE] | [OPEN INVOICE AMOUNT] |
|---|---|---|---|---|---|
| 01/22/2021 | 00100000 | INV1000 | INV | 06/08/2020 | 1000 |
| 01/22/2021 | 00100000 | INV1001 | INV | 06/15/2020 | 50 |
| 01/22/2021 | 00100000 | INV1002 | INV | 08/20/2020 | 50 |
| 01/22/2021 | 00100000 | INV1005 | CM | 10/18/2020 | -100 |
| 01/22/2021 | 00100000 | PAY1000 | PAY | 06/15/2020 | -750 |
| 01/22/2021 | 00100000 | PAY1000 | PAY | 06/15/2020 | 820 |
我正在尝试对这些数据进行分组,因为我需要对每张发票的未结发票金额行求和。该文件将自动导出到另一家公司以处理 AR 信息。列标题需要准确,如下所示。我通常使用别名进行分组,但使用 2 个字的固定列标题,我有点难以弄清楚如何对这段代码进行分组。另外,您将如何对 GETDATE() 和 CASE 语句进行分组?
SELECT
CONVERT (nvarchar(30), GETDATE(), 101) as [FILE DATE],
GACC.BPR_0 as [CUSTOMER ID],
GACC.NUM_0 as [INVOICE NUMBER],
GACC.TYP_0 as [INVOICE TYPE],
Case
When GACC.TYP_0 in ('INV', 'CM') Then CONVERT (nvarchar(30), SI.BPRDAT_0 , 101)
Else CONVERT (nvarchar(30), PAY.ACCDAT_0 , 101)
End as [INVOICE DATE],
(GACC.AMOUNT_0 * GACC.SNS_0) as [OPEN INVOICE AMOUNT] --- want to SUM and group this column for each INV#
FROM dbo.GACCDUDATE as GACC
left join dbo.SINVOICE as SI --- Invoice Table
on GACC.NUM_0 = SIV.NUM_0
left join dbo.PAYMENT as PAY -- Payment Table
on PAY.NUM_0 = GACC.NUM_0
非常感谢您帮助我为每个客户、发票、未结金额总和进行分组。
编辑 - 所需的输出
| [FILE DATE] | [CUSTOMER ID] | [INVOICE NUMBER] | [INVOICE TYPE] | [INVOICE DATE] | [OPEN INVOICE AMOUNT] |
|---|---|---|---|---|---|
| 01/22/2021 | 00100000 | INV1000 | INV | 06/08/2020 | 1000 |
| 01/22/2021 | 00100000 | INV1001 | INV | 06/15/2020 | 50 |
| 01/22/2021 | 00100000 | INV1002 | INV | 08/20/2020 | 50 |
| 01/22/2021 | 00100000 | INV1005 | CM | 10/18/2020 | -100 |
| 01/22/2021 | 00100000 | PAY1000 | PAY | 06/15/2020 | 70 |
【问题讨论】:
-
请提供样本数据和所需的输出
-
如果你想使用 group by 那么你必须包含所有未聚合的列。如果您需要包含非聚合列,请查找窗口函数
-
正确,但是当我的案例语句的别名是第一列中的 [INVOICE DATE] 或 [FILE DATE] 时,它不允许我们使用 groupby。我可以将 groupby 中的字段用于其他列。
-
只需将您的查询包装在一个公用表表达式中,然后您就可以在进一步的查询中引用您在 CTE 中的别名,从而避免别名的任何问题。或者只是按 CONVERT (nvarchar(30), GETDATE(), 101) 分组。 CTE 更干净