【问题标题】:How to GroupBy based on GetDate() , CASE and fixed column aliases如何根据 GetDate() 、 CASE 和固定列别名进行分组
【发布时间】: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 更干净

标签: sql tsql alias


【解决方案1】:

使用 CTE 引用别名。或者,就像我在评论中所说的那样,只需在 "CONVERT (nvarchar(30), GETDATE(), 101)""(GACC.AMOUNT_0 * GACC.SNS_0)" 上分组

With MyInvoices as 
(
    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]   
    FROM dbo.GACCDUDATE as GACC
    left join dbo.SINVOICE as SI 
    on GACC.NUM_0 = SIV.NUM_0
    left join dbo.PAYMENT as PAY  
    on PAY.NUM_0 = GACC.NUM_0
)
select [FILE DATE], [CUSTOMER ID], [INVOICE NUMBER], [INVOICE TYPE],[INVOICE DATE],[OPEN INVOICE AMOUNT] from MyInvoices
group by  [FILE DATE], [CUSTOMER ID], [INVOICE NUMBER], [INVOICE TYPE],[INVOICE DATE]

【讨论】:

  • 约翰尼,非常感谢!这绝对成功了!
猜你喜欢
  • 2022-09-22
  • 1970-01-01
  • 2017-10-09
  • 1970-01-01
  • 2014-06-28
  • 1970-01-01
  • 2019-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多