2016-06-29 6 views
-1

У меня есть запрос на выборку, который выглядит следующим образом:Ввести новые поля Выбор запроса на основе значений расщепления от 1-го столбца

SELECT 
LEFT([Total INNOVATIONS/MMD],INSTR(1,[Total INNOVATIONS/MMD],'-')-2) AS BRAND, MID([Total INNOVATIONS/MMD],INSTR(1,[Total INNOVATIONS/MMD],'-')+2 , INSTRREV([Total INNOVATIONS/MMD],'-')-2) AS INNOTYPE, RIGHT([Total INNOVATIONS/MMD], INSTRREV([Total INNOVATIONS/MMD],'-')+2) AS RECDATE, [Fact], 
[Week Ending 05/01/14], [Week Ending 12/01/14], [Week Ending 19/01/14], [Week Ending 26/01/14], [Week Ending 02/02/14], [Week Ending 09/02/14], [Week Ending 16/02/14], [Week Ending 23/02/14], [Week Ending 02/03/14], [Week Ending 09/03/14], [Week Ending 16/03/14], [Week Ending 23/03/14], [Week Ending 30/03/14], [Week Ending 06/04/14], [Week Ending 13/04/14], [Week Ending 20/04/14], [Week Ending 27/04/14], [Week Ending 04/05/14], [Week Ending 11/05/14], [Week Ending 18/05/14], [Week Ending 25/05/14], [Week Ending 01/06/14], [Week Ending 08/06/14], [Week Ending 15/06/14], [Week Ending 22/06/14], [Week Ending 29/06/14], [Week Ending 06/07/14], [Week Ending 13/07/14], [Week Ending 20/07/14], [Week Ending 27/07/14], [Week Ending 03/08/14], [Week Ending 10/08/14], [Week Ending 17/08/14], [Week Ending 24/08/14], [Week Ending 31/08/14], [Week Ending 07/09/14], [Week Ending 14/09/14], [Week Ending 21/09/14], [Week Ending 28/09/14], [Week Ending 05/10/14], [Week Ending 12/10/14], [Week Ending 19/10/14], [Week Ending 26/10/14], [Week Ending 02/11/14], [Week Ending 09/11/14], [Week Ending 16/11/14], [Week Ending 23/11/14], [Week Ending 30/11/14], [Week Ending 07/12/14], [Week Ending 14/12/14], [Week Ending 21/12/14], [Week Ending 28/12/14] FROM [Sheet1$] WHERE Fact="ACV Dist" 

я представил 3 новых полей, а именно

«BRAND» , "INNOTYPE", "RECDATE"

в SQL-запрос, чтобы сформировать набор записей. Значения для этих новых столбцов должны быть выбраны путем разделения 1-го поля на разделителе «-». , например.

strConString = _ 
"Provider=Microsoft.ACE.OLEDB.12.0; " _ 
& "Data Source='" & varPathAndFile & "'; " _ 
& "Extended Properties=""Excel 12.0 XML;HDR=YES;IMEX=1"";" 


strSQL = "SELECT TOP 1 * FROM [Sheet1$]" 
Set objCON = CreateObject("ADODB.Connection") 
objCON.Open strConString 

Set objRS = CreateObject("ADODB.Recordset") 
With objRS 
    .locktype = ADOLockType.adLockOptimistic 
    .CursorType = ADOCursorType.adOpenStatic 
    .cursorlocation = ADOCursorLocation.adUseClient 
    .Source = strSQL 
    .activeconnection = objCON 
    .Open 
    .movelast 
    .movefirst 

    Stop 
    strSQL = "SELECT " 
    For Each fld In .Fields 
     If InStr(1, fld.Name, "INNOVATIONS") > 0 Then 

      strFieldValue = fld.Name 

      --strSQL = strSQL & "[" & fld.Name & "], " 
      strSQL = strSQL & " LEFT([" & strFieldValue & "],INSTR(1,[" & strFieldValue & "],'-')-2) AS BRAND," 
      strSQL = strSQL & " MID([" & strFieldValue & "],INSTR(1,[" & strFieldValue & "],'-')+2 , INSTRREV([" & strFieldValue & "],'-')-2) AS INNOTYPE," 
      strSQL = strSQL & " RIGHT([" & strFieldValue & "], INSTRREV([" & strFieldValue & "],'-')+2) AS RECDATE," 
     End If 

     If fld.Name = "Fact" Then 
      strSQL = strSQL & " [" & fld.Name & "], " 
     End If 

     If InStr(1, fld.Name, "Week Ending") > 0 And Right(fld.Name, 2) = Right(lngYear, 2) Then 
      strSQL = strSQL & "[" & fld.Name & "], " 
     End If 
    Next fld 

Stop 

    If Right(Trim(strSQL), 1) = "," Then strSQL = Left(Trim(strSQL), Len(Trim(strSQL)) - 1) 
    strSQL = strSQL & " FROM [Sheet1$] WHERE Fact=""ACV Dist"" " 

    Debug.Print strSQL 
    .Close 
    .Source = strSQL 
Stop 
    .Open 

Stop 

Как я заполнить значения в эти 3 поле столбцов с 1-го поля колонок (раскалывает его значение)?

+1

показывает фактическое заявление SQL вы строите со всем этим ... –

+0

@MarcB я не сделал понимаете, что вы имели в виду. Я показал инструкцию sql и весь код. Мне просто нужно найти способ либо изменить инструкцию SQL, чтобы он мог заполнить 3 новых столбца из 1-го столбца, либо найти способ через VBA для заполнения трех столбцов. Первое - это то, что мне действительно нравится. Кроме того, если есть способ избавиться от 1-го столбца после заполнения 3 столбцов из его значений, тогда ничего подобного!:) – sifar786

+0

так что «somevariabletext» - это то, что буквально появляется в вашем запросе? И ничего себе ... вы действительно должны искать нормализацию базы данных. имея много столбцов для по существу «тех же» данных, смехотворно. –

ответ

1

Много чего происходит с построенной динамической строкой.

Сначала вы начинаете с SELECT, а затем попытаетесь проверить, есть ли в первой части строки запятая ",", потому что вы автоматически вставляете запятую во время цикла. Исправить, не добавляя select до после тестирования для первой запятой.

Второй. вы повторяете 3 столбца дважды. BRAND, INNOTYPE, RECDATE если оба нововведения и факт находятся в полевом наборе.

После определения вашего нового столбца вы просто используете имя BRAND, INNOTYPE, RECDATE, но тогда SQL считает, что это имя столбца и даст вам сообщение об ошибке. Закрепить за счет изменения в NULL AS BRAND, NULL AS INNOTYPE, и т.д .. Но тогда вы, вероятно, также хочу сказать, это тип данных, так CAST(NULL AS VARCHAR(100)) AS BRAND, CAST(NULL AS VARCHAR(100)) AS INNOTYPE, и т.д ... Если вы действительно просто хотите пустое строковое значение сделать что-то вроде CAST('' AS VARCHAR(100)) AS BRAND

печати ваши заявления SQL при отладке и тесты и ошибки станут более очевидными.

поиск, как получить подстроку из строки. И сделайте некоторые тесты на данные. Но это, скорее всего, будет комбинация LEFT(Innovations,CHARINDEX('-',Innovations) - 1) будет первым полем SUBSTRING(Innovations,CHARINDEX('-',Innovations),CHARINDEX('-',REVERSE(Innovations))) для второго RIGHT(Innovations,CHARINDEX('-',REVERSE(Innovations)) - 1) для 3-го.

Это предполагает, что у вас всегда будет 2 '-' дефис и нет пробелов. Если есть места, оберните полученный результат substring в LTRIM(RTRIM()), чтобы избавиться от них.

версии MS Access подстрок

Left(Innovations,InStr(1,Innovations,'-') - 1) 

MID(Innovations,InStr(1,Innovations,'-'),InStrRev(Innovations,'-')) 

RIGHT(Innovations,InStrRev(Innovations,'-') - 1) 

И если у вас есть пробелы просто положить те внутри TRIM()

+0

спасибо, что указал. линия проверки запятой была ошибкой вырезания и вставки. я исправил его в исходном посте. Столбец, содержащий текст «ИННОВАЦИИ», является первым столбцом, из которого я хочу разделить и использовать его значения, чтобы заполнить остальные 3 столбца. Столбец «Факты» содержит только 2 типа: «ACV Dist» и «Wgt Dist». Я хочу фильтровать данные только на ACV Dist. «CAST (NULL AS VARCHAR (100)) AS BRAND, CAST (NULL AS VARCHAR (100)) КАК ИННОТИЙ« ..... это интересно и что-то новое для меня. Будет ли это работать в MSAccess? я должен попытаться вернуться к вам. – sifar786

+0

Но вопрос в том, как разбить значения 1-го столбца на «-» и поместить их в 3 столбца? – sifar786

+0

Да, я получил то, что вы имели в виду, дважды повторяя колонку «Инновации и факты». – sifar786

 Смежные вопросы

  • Нет связанных вопросов^_^