如何将两个不同的大小写 sql 合并为 1?
How to combine two different case sql into 1?
*这个问题之前在Whosebug问过
.How to use if then statement on sql?
我这里修改了再问*
1) "SELECT officer, null, sum(mkt), Sum(Non), sum(ICP), (sum(mkt)+Sum(Non)+sum(ICP)) as total From [DB$] group by officer
" <= 他们没问题。他们应该按官员分组,因为每个官员都有很多记录
2)对于field-mkt来说,不一定是由每条记录中的value组成的。当 mkt 包含值时,比如 30,这意味着官员进行现场工作。因此,我应该计算他的现场工作时间 -Totalmin。
officer mkt Totalmin
S29 30 50
S29 60
S29 70 80
S29 80
S55 30 80
S55 60
S55 70 80
S55 80
因此,结果应该是:
officer sum(totalmin)
s29 130
s55 160
这里你可以想象。如果 Mkt 字段由数字组成,则总的 min 将相加成为 min-required .
在图片中,最小要求的输出应该是45+40=85
group by officer (staffid-186 )
这个sql怎么写?
而且,问题是我必须将这两种情况合并到同一个 sql 中。我怎么可以?
我不太清楚你的要求,但看起来你需要这样的东西,
SELECT officer ,null,sum(mkt) ,Sum(Non),sum(ICP),(sum(mkt)+Sum(Non)+sum(ICP) ) as total,
SUM(IIF( isnumeric(mkt) = true AND Survey = 'CPI' AND Activity = 'FI', Totalmin, 0 )) AS TotalMin
From [DB$]
group by officer
您可以在 select 中使用子查询来完成这样的任务:
Sub SQL()
Dim cn As Object: Set cn = CreateObject("ADODB.Connection")
Dim rs As Object: Set rs = CreateObject("ADODB.Recordset")
Dim tbl1$, QT, strFile$, strCon$, strSQL$
strFile = ThisWorkbook.FullName 'if not active file then specify path!!!
strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFile & ";Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1"";"
cn.Open strCon
tbl1 = "[Sheet1$" & Sheets("Sheet1").UsedRange.Address(0, 0) & "]" 'replace sheet1 with required sheet name
strSQL = "SELECT o.officer ," & _
" NULL ," & _
" SUM(o.mkt) ," & _
" SUM(o.Non) ," & _
" SUM(o.ICP) ," & _
" ( SELECT SUM(i.Totalmin) FROM " & tbl1 & " AS i " & _
" WHERE i.Mkt > 0 AND i.officer = o.officer) AS TotalMin " & _
" FROM " & tbl1 & " AS o " & _
" GROUP BY o.officer"
rs.Open strSQL, cn
Workbooks.Add
Set QT = ActiveSheet.QueryTables.Add(rs, ActiveSheet.[A1]): QT.Refresh: QT.Delete
rs.Close
cn.Close
End Sub
我已经测试过这种方法,所以它应该也适合你:
来源:
输出:
*这个问题之前在Whosebug问过
.How to use if then statement on sql?
我这里修改了再问*
1) "SELECT officer, null, sum(mkt), Sum(Non), sum(ICP), (sum(mkt)+Sum(Non)+sum(ICP)) as total From [DB$] group by officer
" <= 他们没问题。他们应该按官员分组,因为每个官员都有很多记录
2)对于field-mkt来说,不一定是由每条记录中的value组成的。当 mkt 包含值时,比如 30,这意味着官员进行现场工作。因此,我应该计算他的现场工作时间 -Totalmin。
officer mkt Totalmin
S29 30 50
S29 60
S29 70 80
S29 80
S55 30 80
S55 60
S55 70 80
S55 80
因此,结果应该是:
officer sum(totalmin)
s29 130
s55 160
这里你可以想象。如果 Mkt 字段由数字组成,则总的 min 将相加成为 min-required .
在图片中,最小要求的输出应该是45+40=85
group by officer (staffid-186 )
这个sql怎么写?
而且,问题是我必须将这两种情况合并到同一个 sql 中。我怎么可以?
我不太清楚你的要求,但看起来你需要这样的东西,
SELECT officer ,null,sum(mkt) ,Sum(Non),sum(ICP),(sum(mkt)+Sum(Non)+sum(ICP) ) as total,
SUM(IIF( isnumeric(mkt) = true AND Survey = 'CPI' AND Activity = 'FI', Totalmin, 0 )) AS TotalMin
From [DB$]
group by officer
您可以在 select 中使用子查询来完成这样的任务:
Sub SQL()
Dim cn As Object: Set cn = CreateObject("ADODB.Connection")
Dim rs As Object: Set rs = CreateObject("ADODB.Recordset")
Dim tbl1$, QT, strFile$, strCon$, strSQL$
strFile = ThisWorkbook.FullName 'if not active file then specify path!!!
strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFile & ";Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1"";"
cn.Open strCon
tbl1 = "[Sheet1$" & Sheets("Sheet1").UsedRange.Address(0, 0) & "]" 'replace sheet1 with required sheet name
strSQL = "SELECT o.officer ," & _
" NULL ," & _
" SUM(o.mkt) ," & _
" SUM(o.Non) ," & _
" SUM(o.ICP) ," & _
" ( SELECT SUM(i.Totalmin) FROM " & tbl1 & " AS i " & _
" WHERE i.Mkt > 0 AND i.officer = o.officer) AS TotalMin " & _
" FROM " & tbl1 & " AS o " & _
" GROUP BY o.officer"
rs.Open strSQL, cn
Workbooks.Add
Set QT = ActiveSheet.QueryTables.Add(rs, ActiveSheet.[A1]): QT.Refresh: QT.Delete
rs.Close
cn.Close
End Sub
我已经测试过这种方法,所以它应该也适合你:
来源:
输出: