ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: cjq253

[求助] 如何使用一个SQL语句实现跨表格多条件多次查询数据,求助~~

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-2-20 15:29 | 显示全部楼层

求和间隔连续就可以了,没数据就是0

TA的精华主题

TA的得分主题

发表于 2019-2-20 15:31 | 显示全部楼层
cjq253 发表于 2019-2-20 15:16
在附件表B里,把数据向下多拉几行,日期顺延,随意按几天间隔求下生产数、不良数可以吗

可以的,等我试一下。
也就是和A 表无关对吧。

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-2-20 15:34 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
魂断蓝桥 发表于 2019-2-20 15:31
可以的,等我试一下。
也就是和A 表无关对吧。

可以先不管,太复杂了,我看不懂~~~~(>_<)~~~~

TA的精华主题

TA的得分主题

发表于 2019-2-20 16:40 | 显示全部楼层
返回结果如下,
如果不对,请告知

日期
型号
生产数
不良数
销售数量
2012-02-14,2012-02-15,2012-02-16
A1,A3
447
24
2012-02-17
A3
242
30
2012-02-14,2012-02-15,2012-02-16
A3,A4,A2
78
2012-02-17
A1
23


Option Explicit

Sub a()
Dim cnn As New ADODB.Connection, r%, sql$, myf$, I%, M%, T%
Dim RS As New ADODB.Recordset
Dim mycnn As New cConnection
Dim myrs As New cRecordset
Dim SQLA$, SQB$, SQC$
mycnn.CreateNewDB ":memory:"
sql = "create table 生产表(生产日期,型号,生产数,不良数,日期分组)"
mycnn.Execute sql
sql = "create table 销售表(销售日期,型号,销售数量,日期分组)"
mycnn.Execute sql
myf = ThisWorkbook.Path & "\数据源2.xlsx"
cnn.Open "Provider=Microsoft.ACE.OleDb.12.0;Extended Properties='Excel 12.0;HDR=YES'; Data Source=" & myf
sql = "SELECT 生产日期,型号,SUM(生产数),SUM(不良数) FROM [表B$A1:D] WHERE 型号 is NOT NULL GROUP BY 生产日期,型号 ORDER BY 1,2"
RS.Open sql, cnn, 1, 1
mycnn.BeginTrans
Do While Not RS.EOF
    M = M + 1
    For T = 1 To 3
        If Not RS.EOF Then
            sql = "INSERT INTO 生产表 values ('" & Format(RS.Fields(0), "YYYY-MM-DD") & "','" & RS.Fields(1) & "'," & RS.Fields(2) & "," _
                         & RS.Fields(3) & "," & M & ")"
             mycnn.Execute sql
            RS.MoveNext
            If RS.EOF Then Exit Do
        End If
    Next
Loop
cnn.Close
myf = ThisWorkbook.Path & "\数据源3.xlsx"
cnn.Open "Provider=Microsoft.ACE.OleDb.12.0;Extended Properties='Excel 12.0;HDR=YES'; Data Source=" & myf
sql = "SELECT 销售日期,型号,SUM(销售数量) FROM [表C$A1:D] WHERE 型号 is NOT NULL GROUP BY 销售日期,型号 ORDER BY 1,2"
RS.Open sql, cnn, 1, 1
M = 0
Do While Not RS.EOF
    M = M + 1
    For T = 1 To 3
        If Not RS.EOF Then
            sql = "INSERT INTO 销售表 values ('" & Format(RS.Fields(0), "YYYY-MM-DD") & "','" & RS.Fields(1) & "'," & RS.Fields(2) & "," & M & ")"
             mycnn.Execute sql
            RS.MoveNext
            If RS.EOF Then Exit Do
        End If
    Next
Loop
mycnn.CommitTrans
sql = "CREATE TABLE T (日期,型号)"
mycnn.Execute sql
sql = "insert into T SELECT  GROUP_CONCAT(生产日期),GROUP_CONCAT(DISTINCT(型号)) as 型号 FROM 生产表 GROUP BY 日期分组  "
mycnn.Execute sql
sql = "INSERT INTO T SELECT GROUP_CONCAT(销售日期),GROUP_CONCAT(DISTINCT(型号)) as 型号 FROM 销售表 GROUP BY 日期分组"
mycnn.Execute sql
Sheet5.Activate
Cells.Clear
SQA = "(SELECT GROUP_CONCAT(生产日期) AS 生产日期,GROUP_CONCAT(DISTINCT(型号)) as 型号,SUM(生产数) AS 生产数,SUM(不良数) AS 不良数 FROM 生产表 GROUP BY 日期分组) B"
SQB = "(SELECT GROUP_CONCAT(销售日期) AS 销售日期,GROUP_CONCAT(DISTINCT(型号)) as 型号,SUM(销售数量) AS 销售数量 FROM 销售表 GROUP BY 日期分组) C"
SQC = "(SELECT DISTINCT 日期,型号  FROM T) A"
sql = "SELECT A.日期,A.型号,B.生产数,B.不良数,C.销售数量 FROM " & SQC & " left join " & SQA & " on A.日期=B.生产日期 and A.型号=B.型号" _
             & " left join " & SQB & " on A.日期=C.销售日期 AND A.型号=C.型号"
    MsgBox sql
myrs.OpenRecordset sql, mycnn
For I = 0 To myrs.Fields.Count - 1
   Cells(1, I + 1) = myrs.Fields(I).Name
Next
Range("a2").CopyFromRecordset myrs.GetADORsFromContent
cnn.Close
Set RS = Nothing
Set cnn = Nothing
Set mycnn = Nothing
Set myrs = Nothing
End Sub


评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-2-20 16:43 | 显示全部楼层
cjq253 发表于 2019-2-20 15:34
可以先不管,太复杂了,我看不懂~~~~(>_

代码审核中,

你需要先下载我签名档中的两个控件,并注册。

a.rar (90.97 KB, 下载次数: 48)

1.gif

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-2-20 17:14 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
魂断蓝桥 发表于 2019-2-20 15:31
可以的,等我试一下。
也就是和A 表无关对吧。

大神,你好
这是我写出来的按周计算的句子,算出来的数据也是正确的,只是“每周”列的数据是每周的代号8、13,怎么才能把这个代号换成具体的日期?
例如:2012/2/14-2012/2/20或者干脆是每周的开始日2012/2/14

我的句子:
"select datepart('ww',生产日期,2) as 每周,sum(生产数) as 生产数,sum(不良数) as 不良数,sum(数量) as 数量 from [Excel 12.0;Database=" & xpath & "数据源2.xlsx;].[表B$A1:E] where 型号 is not null group by datepart('ww',生产日期,2)"





TA的精华主题

TA的得分主题

发表于 2019-2-20 19:40 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-2-20 22:10 | 显示全部楼层
魂断蓝桥 发表于 2019-2-20 16:40
返回结果如下,
如果不对,请告知

好复杂,我要好好研究下!
大神辛苦了,万分感谢!

TA的精华主题

TA的得分主题

发表于 2019-2-21 08:32 | 显示全部楼层
cjq253 发表于 2019-2-20 22:10
好复杂,我要好好研究下!
大神辛苦了,万分感谢!

用sqlite比较容易实现

select '第'||strftime('%W',销售日期,'weekday 1')||'周  '||MIN(销售日期)||'至'||MAX(销售日期) AS 日期,
GROUP_CONCAT(DISTINCT(型号)) AS 型号,SUM(数量) AS 销售数量
FROM T6
GROUP BY strftime('%W',销售日期,'weekday 1')

1.PNG

2.PNG

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-2-21 13:37 | 显示全部楼层
魂断蓝桥 发表于 2019-2-21 08:32
用sqlite比较容易实现

select '第'||strftime('%W',销售日期,'weekday 1')||'周  '||MIN(销售日期)||' ...

好的,感谢,继续努力学习中~
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-17 04:26 , Processed in 0.049421 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表