2010-07-01 2 views
1

вот проблеск исходной таблицы:мс доступа: запрос (Concat несколько записей в один)

Occurrence Number Occurrence Date 1 0 Preanalytical (Before Testing) Cup Type 2 0 Analytical (Testing Phase) 2 0 Area 3 0 Postanalytical (After Testing) 4 0 Other Practice Code Comments 
1477 2/5/2010 1.1 Specimen Mislabeled      PURSLEY 
1476 2/5/2010 1.1 Specimen Mislabeled      HPMR  
1475 2/5/2010 1.1 Specimen Mislabeled      ACCIM N008710 
1474 2/5/2010 1.1 Specimen Mislabeled      ACCIM N008636 
1473 2/5/2010 1.3 QNS-Quantity Not Sufficient      SAPMC 
1472 2/5/2010 1.3 QNS-Quantity Not Sufficient      RMG 
1471 2/5/2010 1.1 Specimen Mislabeled      NMED  
1470 2/5/2010 1.9 QNS- Specimen Spilled in transit      MRPS  
1469 2/5/2010 1.9 QNS- Specimen Spilled in transit      ANESPC 
1468 2/5/2010   2.22 Instrument Problem-reinject    LAB 
1525 2/8/2010   2.5 Other - False (+) Blanks Tecan 2   LAB 
1524 2/8/2010   2.5 Other - False (+) Blanks Tecan #1   LAB Blank 019 
1523 2/8/2010   2.22 Instrument Problem, 2.5 Other Tecan   LAB 
1519 2/8/2010     3.3A Reporting Error 4.1 LIS Problem? (see LOM 1418,1520) LAB/SJC F356028 
1518 2/8/2010 1.4 Tests Missed/Wrong Test Ordered      SDPTC F316628 
1516 2/8/2010 1.6 Test Requisition Missing      TPMCF 2 specimens both unlabeled 
1515 2/8/2010 1.1 Specimen Mislabeled      PALMETTO  
1514 2/8/2010 1.1 Specimen Mislabeled      THWR  
1513 2/8/2010 1.1 Specimen Mislabeled      THWR  

я получаю информацию из этой таблицы, используя следующую инструкцию:

select mid(Lom1,1,4) as LOM, sum([Count1]) as [Count] from (

SELECT [Lab Occurrence Form].[1 0 Preanalytical (Before Testing)] as Lom1,Count([Lab Occurrence Form].[1 0 Preanalytical (Before Testing)]) AS [Count1] 
FROM [Lab Occurrence Form] 
WHERE ((([Lab Occurrence Form].[Occurrence Date]) Between [Forms]![Meeting_Reasons_Frequency]![Text4] And [Forms]![Meeting_Reasons_Frequency]![Text2])) 
GROUP BY [Lab Occurrence Form].[1 0 Preanalytical (Before Testing)] 
HAVING Count([Lab Occurrence Form].[1 0 Preanalytical (Before Testing)])<>0 

UNION SELECT [Lab Occurrence Form].[2 0 Analytical (Testing Phase)], Count([Lab Occurrence Form].[2 0 Analytical (Testing Phase)]) AS [CountOf2 0 Analytical (Testing Phase)] 
FROM [Lab Occurrence Form] 
WHERE ((([Lab Occurrence Form].[Occurrence Date]) Between [Forms]![Meeting_Reasons_Frequency]![Text4] And [Forms]![Meeting_Reasons_Frequency]![Text2])) 
GROUP BY [Lab Occurrence Form].[2 0 Analytical (Testing Phase)] 
HAVING Count([Lab Occurrence Form].[2 0 Analytical (Testing Phase)])<>0 

union 

SELECT [Lab Occurrence Form].[3 0 Postanalytical (After Testing)], Count([Lab Occurrence Form].[3 0 Postanalytical (After Testing)]) AS [CountOf3 0 Postanalytical (After Testing)] 
FROM [Lab Occurrence Form] 
WHERE ((([Lab Occurrence Form].[Occurrence Date]) Between [Forms]![Meeting_Reasons_Frequency]![Text4] And [Forms]![Meeting_Reasons_Frequency]![Text2])) 
GROUP BY [Lab Occurrence Form].[3 0 Postanalytical (After Testing)] 
HAVING Count([Lab Occurrence Form].[3 0 Postanalytical (After Testing)])<>0 

UNION SELECT [Lab Occurrence Form].[4 0 Other], Count([Lab Occurrence Form].[4 0 Other]) AS [CountOf4 0 Other] 
FROM [Lab Occurrence Form] 
WHERE ((([Lab Occurrence Form].[Occurrence Date]) Between [Forms]![Meeting_Reasons_Frequency]![Text4] And [Forms]![Meeting_Reasons_Frequency]![Text2])) 
GROUP BY [Lab Occurrence Form].[4 0 Other] 
HAVING Count([Lab Occurrence Form].[4 0 Other])<>0 
ORDER BY 1, 2) 

group by mid(Lom1,1,4); 

это то, что возвращает запрос:

LOM Count 
1.1  231 
1.11 21 
1.3  103 
1.4  6 
1.5  1 
1.6  25 
1.8  2 
1.9  88 
2.1  8 
2.22 5 
2.24 1 
2.3  1 
2.4  1 
2.5  29 
3.2  13 
3.3  8 
3.3A 4 
4.1  2 
4.6  1 
4.8  7 

Мне нужно добавить еще один столбец здесь. скажем, это column3

это вывод, что нужно:

LOM Count column3 
1.1  231 everything from original table where LOM LIKE *1.1* separated by "," 
1.11 21 everything from original table where LOM=1.11 separated by "," 
1.3  103 everything from original table where LOM=1.3 separated by "," 
1.4  6 everything from original table where LOM=1.4 separated by "," 
1.5  1 everything from original table where LOM=1.5 separated by "," 
1.6  25 
1.8  2 
1.9  88 
2.1  8 
2.22 5 
2.24 1 
2.3  1 
2.4  1 
2.5  29 
3.2  13 
3.3  8 
3.3A 4 
4.1  2 
4.6  1 
4.8  7 
prac 1 

, что будет означать первый элемент в колонке 3 будет "something1, something2 и т.д ... somethingelse231"

я прошу прощения, если это объяснение ужасно, пожалуйста, дайте мне знать, если я могу что-нибудь прояснить

ответ

1

Вот одно решение я нашел: http://www.access-programmers.co.uk/forums/showpost.php?p=272455&postcount=2

Для этого требуется написать функцию VBA. Я не знаю, как это сделать с прямым SQL в Access.

Public Function Conc(Fieldx, Identity, Value, Source) As Variant 
    Dim cnn As ADODB.Connection 
    Dim rs As ADODB.Recordset 
    Dim SQL As String 
    Dim vFld As Variant 

    Set cnn = CurrentProject.Connection 
    Set rs = New ADODB.Recordset 
    vFld = Null 

    SQL = "SELECT [" & Fieldx & "] as Fld" & _ 
     " FROM [" & Source & "]" & _ 
     " WHERE [" & Identity & "]=" & Value 

    ' open recordset. 
    rs.Open SQL, cnn, adOpenForwardOnly, adLockReadOnly 

    ' concatenate the field. 
    Do While Not rs.EOF 
    If Not IsNull(rs!Fld) Then 
     vFld = vFld & ", " & rs!Fld 
    End If 
    rs.MoveNext 
    Loop 
    ' remove leading comma and space. 
    vFld = Mid(vFld, 3) 

    Set cnn = Nothing 
    Set rs = Nothing 

    ' return concatenated string. 
    Conc = vFld 
End Function 

Вы можете использовать его в запросе, как это:

SELECT [tblData].[ID], 
     Conc("Field1","ID",[ID],"tblData") AS Field1, 
     Conc("Field2","ID",[ID],"tblData") AS Field2 
FROM tblData 
GROUP BY [tblData].[ID]; 

Edit Таким образом, ваш первый запрос будет выглядеть следующим образом:

SELECT [Lab Occurrence Form].[1 0 Preanalytical (Before Testing)] as Lom1, 
     Conc("NameOfTheFieldToConcatenate", 
      "[Lab Occurrence Form].[1 0 Preanalytical (Before Testing)]", 
      [Lab Occurrence Form].[1 0 Preanalytical (Before Testing)], 
      "[Lab Occurrence Form]"), 
     Count([Lab Occurrence Form].[1 0 Preanalytical (Before Testing)]) AS [Count1] 
FROM [Lab Occurrence Form] 
WHERE ((([Lab Occurrence Form].[Occurrence Date]) Between [Forms]![Meeting_Reasons_Frequency]![Text4] And [Forms]![Meeting_Reasons_Frequency]![Text2])) 
GROUP BY [Lab Occurrence Form].[1 0 Preanalytical (Before Testing)] 
HAVING Count([Lab Occurrence Form].[1 0 Preanalytical (Before Testing)])<>0 

Заметьте, что вы можете вам нужно немного настроить функцию Conc(), чтобы получить нужный вам вариант wildard вместо точного совпадения в поле LOM.

+0

большое спасибо. это может быть правильным решением –

+0

им жаль, что может объяснить, что именно это делает –

+0

может помочь мне включить это в мой текущий SQL-запрос –