ms-access:query(将多个记录连成一个)

时间:2010-07-01 19:28:04

标签: sql ms-access

这里是原始表的一瞥:

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,etc ...... somethingelse231”

如果这个解释太可怕,我道歉,如果我能澄清任何事情,请告诉我。

1 个答案:

答案 0 :(得分:1)

我找到了一个解决方案:http://www.access-programmers.co.uk/forums/showpost.php?p=272455&postcount=2

它需要编写VBA函数。我不知道在Access中使用直接SQL的方法。

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];

修改 所以你的第一个查询看起来像这样:

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()函数以获得您想要的比较,而不是LOM字段上的完全匹配。