2016-07-05 19 views
3

* Diese Frage wurde bereits im Stackoverflow gestelltWie kombiniert man zwei verschiedene case sql in 1?

. How to use if then statement on sql?

habe ich geändert und gefragt, hier wieder *


1) "SELECT officer, null, sum(mkt), Sum(Non), sum(ICP), (sum(mkt)+Sum(Non)+sum(ICP)) as total From [DB$] group by officer" < = sie in Ordnung sind. sie sollten von dem Beamten gruppiert werden, da jeder Offizier


2) Für das Feld mkt viele Datensätze hat, ist es nicht unbedingt bestand aus Wert in jedem Datensatz. Wenn mkt aus einem Wert besteht, sagen wir 30, bedeutet das, dass der Offizier den Feldjob ausführt. Daher sollte ich seine Feldstunde zählen - Totalmin.

officer mkt Totalmin 
    S29 30 50 
    S29 60 
    S29 70 80 
    S29 80 
    S55 30 80 
    S55 60 
    S55 70 80 
    S55 80 

Daher sollte das Ergebnis sein:

officer sum(totalmin) 
    s29  130 
    s55  160 

enter image description here

Sie hier vorstellen können. Wenn das Mkt-Feld aus Zahlen besteht, wird die Gesamtmin addiert und zum Mindestwert.

im Bild, die min-erforderliche Ausgabe von Offizier (StaffID-186) 45+40=85 Gruppe

Wie schreibt man diese SQL sein sollte?


Und das Problem ist, dass ich diese beiden Fälle in derselben SQL kombinieren muss. Wie kann ich?

+0

welche DBMS verwenden Sie? Ich kann nur sehen, dass Sie Excel verwenden. – Raptor

+0

@Raptor ich verwende Excel. Dann importieren Sie ADO und führen Sie den SQL-Code in VBA – Vito

+0

Kann man das nicht tun, indem Sie eine Klausel "WHERE mkt Is Not Null" hinzufügen? –

Antwort

1

Sie können für eine solche Aufgabe in ausgewählten Unterabfrage verwenden:

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 

ich getestet habe dieser Ansatz, so sollte es funktioniert für Sie zu fein:

Quelle:

enter image description here

Ausgang:

enter image description here

+1

ich denke, es sollte funktionieren – Vito

1

Ich bin nicht ganz klar über Ihre Anforderung aber sieht aus wie Sie so etwas wie dieses benötigen,

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 
+0

SUM (CASE WHEN isnumeric (mkt) = 1 THEN Gesamtmin ELSE 0 END) Als TotalMin Syntaxfehler – Vito

+0

ich bin nicht sicher, CASE ist es funktional in Microsoft ADO. Aber ich bin sicher, dass IIF in ADO verwendbar ist. Kann es in das IIF-Format konvertiert werden? – Vito

+0

versuchen, als - SUM ändern (IIF (isnumeric (mkt) = 1, Totalmin, 0)) AS TotalMin –