【问题标题】:How get sum of price by date and get null result?如何按日期获取价格总和并获得空结果?
【发布时间】:2021-12-21 05:25:32
【问题描述】:

我目前有一个按供应商和价格对文章进行分组的 excel 文件,我想通过价格总和按日期(年份)对所有文章进行分组。现在使用这段代码,我得到一个这样的数组:

Dim sql As String
Dim rs As New ADOR.Recordset
Dim arr As Variant
Const filepath As String = "C:\Users\XXXXXX\Documents\excel\XXXXXX.xlsm"
    
Dim connectionString As String
connectionString = _
    "Provider=Microsoft.ACE.OLEDB.12.0;" & _
    "Data Source=""" & filepath & """;" & _
    "Extended Properties=""Excel 12.0;HDR=Yes"""

First_Timer = Timer()
sql = "SELECT data.[article], FORMAT (data.[date], 'yyyy'), SUM(data.[price]) FROM [data$] as data GROUP BY data.[article], FORMAT (data.[date], 'yyyy') "
    
rs.Open sql, connectionString
arr = rs.GetRows
rs.Close

以这个数据为例:

fournisseur article price date
53940 XXXXX 1116833 15 15/10/2021
53940 XXXXX 1116833 15 15/10/2021
53940 XXXXX 1116833 15 15/10/2010
53940 XXXXX 5556833 15 15/10/2019
53940 XXXXX 5556833 25 15/10/2017
53940 XXXXX 5556833 45 15/10/2017

我明白了:

arr(0,x) arr(1,x) arr(2,x)
1116833 2021 30
1116833 2010 15
5556833 2019 15
5556833 2017 60

但我想得到:

arr(0,x) arr(1,x) arr(2,x)
1116833 2010 15
1116833 2011 0
1116833 ... 0
1116833 2019 0
1116833 2021 30
5556833 2010 0
5556833 ... 0
5556833 2016 0
5556833 2017 60
5556833 2018 0
5556833 2019 15
5556833 2020 0
5556833 2021 0

通过在不同论坛上寻找解决方案,我了解到我们可以将 IIF 和 COALESCE 放在 SUM 上,这样如果不存在带有日期的列,SQL 就会返回 0:

SELECT data.[article], FORMAT (data.[date], 'yyyy'), IIF(SUM(data.[price]) IS NULL,0,SUM(data.[price])) FROM [data$] as data GROUP BY data.[article], FORMAT (data.[date], 'yyyy') 

SELECT data.[article], FORMAT (data.[date], 'yyyy'), SUM(IIF(data.[price] IS NULL,0,SUM(data.[price]))) FROM [data$] as data GROUP BY data.[article], FORMAT (data.[date], 'yyyy')

“参数类型错误、超出范围或相互冲突”

SELECT data.[article], FORMAT (data.[date], 'yyyy'), COALESCE(SUM(data.[price]),0) FROM [data$] as data GROUP BY data.[article], FORMAT (data.[date], 'yyyy')

“La methode 'Open' de l'objet '_Recordset' à échoué”

如果有人对我有线索,我就是接受者

【问题讨论】:

  • 我会尝试像SUM(isnull(data.[price],0)) 这样的东西,但不确定我是否完全明白你的要求:)
  • SUM(ISNULL(data.[price],0)) 给我一个错误:“函数使用的参数数量不正确”:(
  • 就是这样的select data.[date], SUM(ISNULL(data.[price],0)) FROM [data$] as data group by data.[date]
  • @Nathan_Sav 还是有错误,我相信 ISNULL 是一个单参数函数,如果 arg1 为 null 则返回 true,但即使替换为 IIF (ISNULL (data. [value]), 0, data. [price]) 我已经没有文章了,如果我想做一个选择数据。[文章]我必须做一个分组数据。[文章]但是ducou我们返回与以前相同的结果:((除了日期格式不再是年份)

标签: sql excel vba


【解决方案1】:

我又来了,我还没有找到我想要的SQL公式但是我有一个好的开始

sql = "SELECT article,"

For i = 2010 To 2021
    sql = sql & " SUM(IIF(year(date) = " & i & ", price, 0))"
    If (i <> 2021) Then sql = sql & ","
Next

sql = sql & " FROM (SELECT * FROM [data$] as data) group by article"

Result get

这几乎是我想要的,我觉得我快到了,现在我无法让 SQL 理解我想要什么,否则它会崩溃或给我不太可能的结果。

【讨论】:

    【解决方案2】:

    我去了一个专门研究法语 VBA / Excel 的论坛,它找到了我要找的东西,我把链接留在这里:https://forum.excel-pratique.com/excel/adodb-obtenir-la-somme-des-prix-par-date-meme-quand-le-resultat-est-null-164113

    如果链接有一天或另一天失效,答案就是:

    Sub test()
    With CreateObject("Adodb.Connection")
        .Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;HDR=YES;"""
            With .Execute("select Date2,article2,Sum(iif(price is null,0,price)) from (select  distinct Date2,article as article2 from [Feuil1$G1:G13], [Feuil1$B1:B7]) as frm Left Join (select Format([Date],'yyyy') as D,article,price from [Feuil1$A1:D7]) as frm2 on  frm2.article=frm.article2  and  frm2.d=cstr(frm.Date2) Group by Date2,article2 order by article2, Date2")
            For i = 0 To .fields.Count - 1
            Debug.Print .fields(i).Name
            Next
            MsgBox .GetString
                 .Close
            End With
            .Close
        End With
            
    End Sub
    

    first_columns

    second_columns

    results

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-17
      • 1970-01-01
      • 1970-01-01
      • 2020-10-05
      • 2011-01-11
      • 1970-01-01
      相关资源
      最近更新 更多