특정 기준이 충족 될 때 여러 행의 데이터를 결합하는 방법


6

여기에 이미지 설명을 입력하십시오
클릭하면 확대

이 Excel 문서를 마사지하려고합니다. AdminTime열 (Column  H)을 제외하고 동일한 연속 행 그룹이 있습니다. 연속 행 그룹이 LastRxNo(Column  C)에 대해 동일한 값을 갖는 경우 Column 이외의 행이 동일하다는 것을 알고  H있습니다. 그룹의 행을 하나의 행으로 결합하고 그룹의 모든 행 AdminTimeAdminTime값을 포함하는 열 을 쉼표로 구분 하여 결합하고 싶습니다 .

여기에 내가 원하는 모습의 사진이 있습니다.

여기에 이미지 설명을 입력하십시오
클릭하면 확대

어떤 아이디어? IF 함수를 생각하고 있었지만 Excel에 익숙하지 않아 작동하지 못했습니다.


Excel의 Microsoft Query 도구를 사용하여 SQL 테이블에서 모든 것을 가져옵니다. 다음은 쿼리입니다.

여기에 이미지 설명을 입력하십시오


28409 이하를 설명 할 수 있는데 왜 통합되지 않습니까? 7A-7P는 이미 동일합니까?
datatoo

실제로 7A-7P AdminTimes를 제거 했어야합니다. 모든 것은 SQL 테이블에서 가져오고 있으며 (다른 시간을 통한 특정 시간)은 하루에 두 번 또는 하루에 세 번 대교 대마다 투약되는 약물입니다. 통합 여부는 중요하지 않습니다. AdminTimes를 단일 행으로 통합하기 위해 동일한 모든 LastRxNo가 필요합니다.

SQL 테이블에서 가져 오기 때문에이 모든 통합을 수행하기 위해 쿼리를 작성할 수 있습니까? 또는이 값을 먼저 Excel에서 지우고 나서해야합니까?
datatoo

내가 생각하는 방식으로 수행 할 수 있습니다. SQL에 대한 지식이 제한적입니다. 그래도 쿼리를 게시 할 수 있습니다.

SQL 에서이 모든 것을 자동으로 수행하는 함수를 만들 수 있습니다.이 기능은 Excel의 vba 솔루션보다 훨씬 쉽습니다. 이 방법을 시도하려면 forums.devshed.com/ms-sql-development-95/… 링크 및 액세스 예제 allenbrowne.com/func-concat.html 링크를 제안 하십시오. 나쁘지 않다
datatoo

답변:


1

행으로 표시되는 것이 아니라 열로 표시되지만이 데이터로 피벗 테이블을 만들 수 있습니다. 즉, 모든 데이터, 삽입> 피벗 테이블을 선택하고 PatID, LastRxNo 및 Admintime을 피벗 테이블의 "행 레이블"영역으로 드래그하고 총계 또는 소계를 숨기십시오 (사진을 게시하지만 내 평판은 아직 여기에서 충분히 높습니다-내 first post!) 다음과 같은 피벗 테이블을 만듭니다 (내 게시물에 올바르게 표시되는지 확실하지 않음) : 855 87160 6AM 2PM 10PM (등)

또는 선택문에서 SQL 쿼리를 변경하여 하나의 셀에 전체 이름을 리턴하는 경우 (Select ......., Patients.PatLName + ','+ Patients.PatFname, ........) 피커가 숫자가 아닌 전체 환자 이름을 반환하도록 할 수 있습니다. Parker, Corde 87160 6AM 2PM 10PM 등

원래 요청한 것과 똑같은 형식이 아닐 수도 있지만 읽기 쉬운 것 같습니다 (메드를 관리했을 때 확인하기 위해 사용한다고 가정)?


1

여기에 이미지 설명을 입력하십시오

코드에 개수를 추가하는 열을 만듭니다.

= B5 & ""& COUNTIF ($ B $ 2 : $ B5, B5)

그런 다음 각 개별 항목을 조회하고 d2의 수식이되는 텍스트를 연결할 수 있습니다.

= IF ($ B2 & ""& 1 = D2, INDEX (C : C, MATCH ($ B2 & ""& 1, D : D, 0)) & ""& IFERROR (INDEX (C : C, MATCH ($ B2 & ""& 2 , D : D, 0)), "") & ""& IFERROR (INDEX (C : C, MATCH ($ B2 & ""& 3, D : D, 0)), "") & ""& IFERROR (INDEX (C : C, MATCH ($ B2 & ""& 4, D : D, 0)), ""), "")

각각의 가능성 당신은 추가해야합니다 &" "&IFERROR(INDEX(C:C,MATCH($B5&" "&5,D:D,0)),"")&5이 될 &6등 위의 공식은 4 개 인스턴스에 뻗어있다.


0

이것은 여전히 ​​많은 할 일을 남기는 다소 빠르고 지저분한 매크로이지만 아이디어를 얻을 수 있습니다. 또한 원본 시트 ( "Sheet1")가 LastRxNo로 정렬되어 있다고 가정합니다. SQLServer에서 함수를 추가하고 호출하는 기능이 있으면 더 간단하고 오류가 적은 작업이됩니다. 이것이 당신이 시작하는 데 도움이되기를 바랍니다. "요약"이라는 시트로 출력합니다.

Sub conCatTimes()
Dim rx As String
Dim admTimes As String
Dim tmp As String
Dim i As Long
Dim LastRow As Long
LastRow = Sheets("Sheet1").Range("C" & ActiveSheet.Rows.Count).End(xlUp).Row
rx = ""
i = 1
For Each cell In Sheets("Sheet1").Range("C2:C" & LastRow)
    If rx <> cell Then
        rx = cell
        i = i + 1
        tmp = ""
    End If
tmp = cell.Offset(0, 11)
admTimes = admTimes + tmp + ", "
    If cell.Offset(1, 0) <> rx Then
        Sheets("summary").Range("A" & i) = rx
        Sheets("summary").Range("B" & i) = Left(admTimes, Len(admTimes) - 2)
        admTimes = ""
    End If
Next

End Sub

응답 주셔서 감사합니다. 예, 꽤 지저분한 매크로처럼 보입니다. 내가 실행하려고하는 다른 유형의 보고서에서 한 줄로 만들고 싶은 여러 줄의 항목을 가로 질러 오는 것처럼 보이기 때문에 더 쉬운 방법이 있기를 바랍니다. 다른 사람이 제안 / 해결책이 있습니까?

"한 줄로 만들고 싶은 여러 줄에있는 것"같은 것? 이것은 LastRxNumber 복사 만 표시했지만 다른 모든 것을 쉽게 포함 할 수 있습니다. adminTimes를 제외한 모든 것이 동일하다면, 여기로 갈 수 있습니다. 그러나 궁극적 쉬운 방법은 그것에게 당신이 필요로하는 방식으로 수출 서버 자체의 기능을 작성하는 것입니다
datatoo

0

매크로를 사용하여 테이블의 내용을 동일한 테이블에 복사하고 AdminTime 열을 무시하면서 중복 값을 필터링 한 다음 원래 테이블을 반복하여 동일한 값을 찾고 모든 AdminTime 값을 단일로 결합하는 것이 좋습니다 끈. 아래 코드에서, 특히 테이블을 정의하고 고유 값으로 필터링하는 경우 필요에 따라 약간 조정해야합니다. 또한 AdminTime이 테이블의 마지막 열이며 그렇지 않을 수도 있다고 가정했습니다.

Option Explicit

Sub combineAdminTimes()

    'Declarations
    Dim tbl1 As ListObject  'Original table
    Dim tbl2 As ListObject  'Abbreviated table
    Dim arrColumns()        'Array of column numbers in which to search for duplicate values
    Dim rcd1 As ListRow     'Generic list row in original table
    Dim rcd2 As ListRow     'Generic list row in abbreviated table
    Dim i As Long           'Generic counter
    Dim blnMatch As Boolean 'Whether or not the two records match and should be combined
    Dim s As String         'String in which to store the combined result

    'Initialize
    Set tbl1 = Sheet1.ListObjects(1)
    Set tbl2 = Sheet2.ListObjects(1)

    'Clear the old filtered list
    If Not tbl2.DataBodyRange Is Nothing Then tbl2.DataBodyRange.Rows.Delete

    'Copy the unfiltered list
    tbl1.DataBodyRange.Copy tbl2.Range(2, 1)

    'Remove all duplicate values
    tbl2.Range.RemoveDuplicates Columns:=Array(1, 2, 3, 4, 5, 6, 7), Header:=xlYes

    'Loop through records in abbreviated table
    For Each rcd2 In tbl2.ListRows
        s = ""
        'Loop through records in original table
        For Each rcd1 In tbl1.ListRows
            'Check if any fields in the two records do not match
            blnMatch = True
            For i = 1 To tbl1.ListColumns.Count - 1
                If rcd1.Range(1, i).Value <> rcd2.Range(1, i).Value Then blnMatch = False
            Next

            'If all matched, then add the time value to the string
            If blnMatch Then
                If LenB(s) > 0 Then s = s & ", "    'Separate each entry by a comma
                s = s & tbl1.ListColumns("AdminTime").Range(rcd1.Range.Row, 1).Value
            End If
        Next

        'Finally, store the combined string in the abbreviated table
        tbl2.ListColumns("AdminTime").Range(rcd2.Range.Row, 1).Value = s
    Next

End Sub

0

이를 위해 Power Query Add-In을 사용합니다. 코드 줄을 쓰지 않고도이 작업을 수행 할 수 있다고 생각합니다.

먼저 Duplicate Column 명령을 사용하여 AdminTimes 열을 복제합니다. 그런 다음 Pivot 명령을 사용하여 AdminTimes 데이터를 열로 변환합니다.

https://support.office.com/en-US/Article/Pivot-columns-abc9c8da-3be9-44c4-886e-0be331ab387a?ui=en-US&rs=en-US&ad=US

피벗 정의에서 값 열을 이전에 만든 "AdminTimes의 복사본"열로 설정하고 총계 값 기능을 "집계하지 않음"으로 설정했습니다. 다른 모든 열별로 자동으로 그룹화됩니다.

그런 다음 열 병합 명령을 사용하여 생성 된 새 열을 하나로 결합합니다. 사용자 정의 구분 기호 인 ","(쉼표, 공백)을 사용하여 프레젠테이션을 가져옵니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.