如何将两个不同的case sql合并为1?

时间:2016-07-05 03:42:18

标签: sql vba excel-vba adodb excel

*此问题之前已在stackoverflow中提出

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,它不一定由每个记录中的值组成。当mkt由值组成时,例如30,这意味着该官员进行现场工作。因此,我应该计算他的场时间 - 总计。

  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

enter image description here

你可以想象一下。如果Mkt字段由数字组成,则总min将加起来并成为最小要求。

在图片中,最小要求的输出应该是45+40=85按人员分组(staffid-186)

如何编写这个sql?

而且,问题是我必须在同一个sql中将这两种情况结合起来。我怎么样?

2 个答案:

答案 0 :(得分:1)

我对你的要求不是很清楚,但看起来你需要这样的东西,

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

答案 1 :(得分:1)

您可以在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

我已经测试了这种方法,所以它也适用于你:

来源:

enter image description here

输出:

enter image description here