2016-08-18 4 views
0

Я использую ADO для запуска SQL в excel.Ошибка SQL UNION ALL

У меня есть 7 таблиц в книге Excel: 2014,2015,2016,2017,2018,2019,2020

Теперь, 2014 и 2015 были заполнены 0,2016 данные были заполнить данные в два раза.

2017,2018, 2019,2020 нет данных внутри, сегодня по-прежнему 2016.

Затем я использую from ...[$2014] UNION ALL from ...[$2014] UNION ALL from ...[$2015] UNION ALL from ...[$2016]....UNION ALL from ...[$2020] соединить все таблицы

Позже я обнаружил, что, когда я смотрю на информацию 2016 года , статистика совершенно неверна. Я долго отлаживаю. Затем выясняю, что проблема заключается в том, что у 2017-2020 нет данных. Я добавляю одну фальшивую строку в 2017-2020 годах соответственно, чтобы проблема была решена.

Но это досадно, что поддельный ряд необходимо добавить в 2017-2020 годах.

Следовательно, любые предложения могут полностью решить вопрос?


SQL(завернутые в строку VBA):

SELECT officer, NULL, 
     SUM(IIF(isnumeric(mkt) = true AND Survey='CPI' AND Activity='FI' AND Outcome= 'C', 
      Totalmin, 0)/468), 
     SUM(IIF(isnumeric(Non) = true AND Survey='CPI' AND Activity='FI' AND Outcome= 'C', 
      Totalmin, 0)/468), 
     NULL, NULL, 
     IIF(ISNULL(SUM(mkt)), 0, SUM(mkt)), 
     Sum(Non), SUM(ICP), (SUM(mkt) + SUM(Non) + SUM(ICP)), 
     NULL, NULL, NULL, 
     COUNT(IIF(Survey='CPI' AND Activity='FI', 
      Totalmin, NULL)), 
     NULL, 
     COUNT(IIF(Survey='CPI' AND Activity='FI' AND 
       (Outcome ='C' OR Outcome='D'OR Outcome='O'), Totalmin, NULL)), 
     NULL, 
     SUM(IIF(Survey='CPI' AND Activity='FI',Totalmin, 0)), 
     NULL, 
     SUM(IIF(Survey='CPI' AND Activity='FI' AND 
      (Outcome ='C' OR Outcome='D'), Totalmin, 0)) 

FROM (SELECT officer, rank, year, month, day, survey, activity, 
      outcome, mkt, non, totalmin, ICP, tabledate FROM [2014$] 
     UNION ALL SELECT officer, rank, year, month, day, survey, activity, 
         outcome, mkt, non, totalmin, ICP, tabledate FROM [2015$] 
     UNION ALL SELECT officer, rank, year, month, day, survey, activity, 
         outcome, mkt, non, totalmin, ICP, tabledate FROM [2016$]) as table3 

WHERE officer IS NOT NULL 
AND officer <> '' AND officer <> ' ' 
AND tabledate >= # " & frommDate & "# 
AND tabledate < # " & tooDate & " # 
GROUP BY officer 
+0

Вы можете построить 'от' часть динамически в цикле, который проходит через все существующие рабочие таблицы в Excel файл – cha

+0

@cha Но это в SQL заявление .а можно запустить цикл VBA в SQL заявление? – evabb

+0

Нет, я предложил запустить цикл в VBA при построении SQL-запроса – cha

ответ

0

псевдо-код от комментариев Ча.

declare SQLunion as string 

for each worksheets 
    if worksheet has data then SQLunion = SQLunion + "select x,y,z from " + worksheet + " union " 
next 

remove the last "union" from SQLunion 
SQLstring = "select a, b, c from (" + SQLunion+ ") where conditions"