3 votes

Comment combiner deux cas différents en un seul ?

*Cette question a déjà été posée dans stackoverflow.

. Comment utiliser l'instruction if then en sql ?

j'ai modifié et redemandé ici *


1) " SELECT officer, null, sum(mkt), Sum(Non), sum(ICP), (sum(mkt)+Sum(Non)+sum(ICP)) as total From [DB$] group by officer " <= ils sont corrects. ils devraient être regroupés par officier, car chaque officier a de nombreux enregistrements.


2) Pour le marché de terrain, il n'est pas nécessairement composé de valeur dans chaque enregistrement. Lorsque la valeur de mkt est égale à 30, cela signifie que l'agent effectue un travail sur le terrain et que je dois donc compter ses heures de travail sur le terrain - Totalmin .

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

Par conséquent, le résultat devrait être :

  officer sum(totalmin)
   s29     130
   s55     160

enter image description here

Vous pouvez imaginer ici que si le champ du marché est constitué de chiffres, le total des min sera additionné et deviendra le min requis.

dans l'image, la sortie minimale requise devrait être de 45+40=85 groupe par agent (staffid-186 )

Comment écrire ce sql ?


Et, le problème est que je dois combiner ces deux cas dans le même sql. Comment puis-je le faire ?

1voto

Jatin Patel Points 1731

Je ne suis pas très clair sur votre demande mais il semble que vous ayez besoin de quelque chose comme ceci,

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

1voto

Vasily Points 4483

Vous pouvez utiliser une sous-requête dans la sélection pour une telle tâche :

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

J'ai testé cette approche, elle devrait donc fonctionner pour vous aussi :

Source :

enter image description here

Salida:

enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X