【发布时间】: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我们返回与以前相同的结果:((除了日期格式不再是年份)