2016-07-05 3 views
3

* Этот вопрос задал ранее в stackoverflowКак объединить два разных случая sql в 1?

. 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) Для полевом МКТ, не обязательно состоит из значения в каждой записи. Когда mkt состоит из значения, скажем, 30, это означает, что офицер выполняет полевое задание. Хенс, я должен считать его полевой час -Talalmin.

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. Как я могу?

+0

, которые СУБД вы используете? Я могу видеть, что вы используете Excel. – Raptor

+0

@Raptor i m с использованием Excel. Затем импортируйте ADO и запустите код SQL в VBA. – Vito

+0

Не можете ли вы сделать это, добавив предложение WHERE mkt Is Not Null? –

ответ

1

вы можете использовать подзапрос в выберите для такой задачи:

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

+1

Я думаю, он должен работать – Vito

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

SUM (CASE WHEN isnumeric (mkt) = 1 THEN Totalmin ELSE 0 END) AS TotalMin синтаксическая ошибка – Vito

+0

i m не уверен, что CASE является функциональной в micsoft ADO. Но я уверен, что IIF можно использовать в ADO. Может ли он преобразовать в формат IIF? – Vito

+0

попробуйте изменить как - SUM (IIF (isnumeric (mkt) = 1, Totalmin, 0)) AS TotalMin –