注册 登录
编程论坛 VB6论坛

如何用这个 group by 呢?

QQ342151559 发布于 2013-08-07 22:51, 466 次点击
表C_History:
程序代码:

C_ID            T_ID
20120102    0102
20120103    0102
20120104    0102
20120105    0103
20120106    0204
20120107    0204
20120108    0204
20120109    0103
20120110    0103
....



每一个独立 C_ID对应一个T_ID,C_ID是不重复,但T_ID可以重复。
表P_History:
程序代码:
C_ID            M_ID    P_ID
20120102    01001    0
20120103    01001    0
20120104    01001    1
20120105    01003    1
20120106    02001    0
20120107    02001    2
20120108    02001    0
20120109    02001    1
20120110    02002    2
。。。


获得如下结果:
程序代码:
T_ID    M_ID    P_ID    Count_P    Count_Total    Ratio
0102    01001    0    2    3    67%
0102    01001    1    1    3    33%
0102    01001    2    0    3    0%
0102    01003    0    0    0    0%
0102    01003    1    0    0    0%
0102    01003    2    0    0    0%
0103    01001    0    0    0    0%
0103    01001    1    0    0    0%
0103    01001    2    0    0    0%
0103    01003    0    0    2    0%
0103    01003    1    1    2    50%
0103    01003    2    1    2    50%
0204    02001    0    2    4    50%
0204    02001    1    1    4    25%
0204    02001    2    1    4    25%


搜索 T_ID,M_ID的个数(Count_Total),以及T_ID,M_ID By P_ID的个数(Count_P),Ratio=(Count_P/Count_Total)*100
这个 搜索语句怎么写呢?如何获取 Count_Total呢,
3 回复
#2
风吹过b2013-08-08 09:59
没看懂。

不知你是不是要这样的结果:
T_ID    M_ID    P_ID    Count_P    Count_Total    Ratio
0102    01001    0    2    3    66.67
0102    01001    1    1    3    33.33
0103    01003    1    1    1    100
0103    02001    1    1    1    100
0204    02001    0    2    3    66.67
0204    02001    2    1    3    33.33
0103    02002    2    1    1    100


由3个查询得到。
查询1:
SELECT C_History.T_ID, P_History.M_ID, count(P_History.P_ID) AS Count_Total
FROM C_History INNER JOIN P_History ON C_History.C_ID=P_History.C_ID
GROUP BY P_History.M_ID, C_History.T_ID;
执行结果:
T_ID    M_ID    Count_Total
0102    01001    3
0103    01003    1
0103    02001    1
0204    02001    3
0103    02002    1



查询2:
SELECT C_History.T_ID, P_History.M_ID, P_History.P_ID, Count(P_History.P_ID) AS Count_P
FROM C_History INNER JOIN P_History ON C_History.C_ID=P_History.C_ID
GROUP BY C_History.T_ID, P_History.M_ID, P_History.P_ID;

执行结果:
T_ID    M_ID    P_ID    Count_P
0102    01001    0    2
0102    01001    1    1
0103    01003    1    1
0103    02001    1    1
0103    02002    2    1
0204    02001    0    2
0204    02001    2    1


查询3:
SELECT 查询2.T_ID, 查询2.M_ID, 查询2.P_ID, 查询2.Count_P, 查询1.Count_Total, Round(查询2.Count_P/查询1.Count_Total*100,2) AS Ratio
FROM 查询2 INNER JOIN 查询1 ON (查询2.T_ID = 查询1.T_ID) AND (查询2.M_ID = 查询1.M_ID);

执行查询3 得到上面的结果。
执行查询3时,不需要再执行 查询1和查询2,会自动调用,我不知道VB 里会不会也这样自动,应该会的。


对应的表的内容如下:
C_ID    T_ID
20120102    0102
20120103    0102
20120104    0102
20120105    0103
20120106    0204
20120107    0204
20120108    0204
20120109    0103
20120110    0103


C_ID    M_ID    P_ID
20120102    01001    0
20120103    01001    0
20120104    01001    1
20120105    01003    1
20120106    02001    0
20120107    02001    2
20120108    02001    0
20120109    02001    1
20120110    02002    2
#3
风吹过b2013-08-08 10:07
程序代码:

Private Sub Form_Load()

'事后绑定
'
连接数据源,打开表
Adodc1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=F:\VB精简版\mdb\db1.mdb;Persist Security Info=False"
Adodc1.RecordSource = "查询3"
'Adodc1.Refresh

'绑定
Set DataGrid1.DataSource = Adodc1

End Sub


VB 能执行写好的 查询3,代码如上。使用的是 事后绑定。
#4
QQ3421515592013-09-21 11:38
呵呵已经解决,非常抱歉现在才回复...
1