如何将两个不同的大小写 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

我已经测试过这种方法,所以它应该也适合你:

来源:

输出: