Text values in a pivot table?

后端 未结 3 1364
悲哀的现实
悲哀的现实 2020-12-20 00:41

I have a table (in MySQL) with 3 columns:

Location    Category     Supplier

   A        Computers    Company X
   A        Printers     Company Y
   B               


        
相关标签:
3条回答
  • 2020-12-20 01:23

    I have no way to check if the query is fine, but more or less would be a query like this:

    SELECT t1.Location, MAX(t1.Computers), MAX(t1.Printers),  MAX(t1.Software)
    
    FROM (
    SELECT
     t.Location,
     CASE WHEN t.Category = 'Computers' THEN
       t.Supplier
     END Computers,
    
     CASE WHEN t.Category = 'Printers' THEN
       t.Supplier
     END Printers,
    
     CASE WHEN t.Category = 'Software' THEN
       t.Supplier
     END Software,
    FROM
    YOUR_TABLE t
    ) t1
    GROUP BY t1.Location
    
    0 讨论(0)
  • 2020-12-20 01:26

    What you seek is often called a crosstab. This can be done statically like so:

    Select Location
        , Min( Case When Category = 'Computers' Then Supplier End ) As Computers
        , Min( Case When Category = 'Printers' Then Supplier End ) As Printers
        , Min( Case When Category = 'Software' Then Supplier End ) As Software
    From MyTable
    Group By Location
    

    However, if what you seek is to have a dynamic number of categories (and thus columns), this cannot be done natively in SQL. This later solution is called a dynamic crosstab. The best approach is either to build the SQL statement akin to the static version above in your middle-tier or using a reporting tool which will do the same.

    0 讨论(0)
  • 2020-12-20 01:40

    I ran into the same problem with pivot tables... Perfect for summaries, but not for text matrices.

    I have just "lifted" some code examples that I used. Here I have the data in columns A-D and build the matrix (in the same sheet) around column F.

    Check to see if this helps.

    I still have trouble getting the code to look right , so please be aware that a lot of the code starts before the code window.

    Code Example 1:

    'Fill in the values
    
    Sheets("TempFile").Select
    
    ListRow = 1
    
    MisMatchCounter = 0
    
    Do Until Cells(ListRow, 1).Value = ""
    
        ' Get table entry from third column of list.
    
        TableEntry = Cells(ListRow, 3).Value
    
        On Error Resume Next
    
        If Err.Number > 0 Then MsgBox Err.Number
    
        ' Get position of product name within range of row titles.
    
        If TableEntry <> "" Then
    
            TableRow = Application.Match(Cells(ListRow, 1), Range("F3:" & MYLastRowAddress), 0) ' 2 rows less than reality
    
            ' Get position of product size within range of column titles.
    
            TableColumn = Application.Match(Cells(ListRow, 2), Range("G2:" & MYLastColAddress), 0)
    
            Set CellToFill = Range("F2").Offset(TableRow, TableColumn)
    
            ' If there's already an entry in the cell, separate it from the new entry with a comma and space.
    
            If Err.Number = 0 Then
    
                If CellToFill.Value <> "" Then
    
                    CellToFill.Value = CellToFill.Value & ","
    
                    CellToFill.Value = CellToFill.Value & TableEntry
    
                Else
    
                    CellToFill.Value = TableEntry
    
                End If
    
            Else
    
                MisMatchCounter = MisMatchCounter + 1
    
                Sheets("Errors").Cells(MisMatchCounter, 1).Value = ListRow
    
                Sheets("Errors").Cells(MisMatchCounter, 2).Value = Cells(ListRow, 1)
    
                Sheets("Errors").Cells(MisMatchCounter, 3).Value = Cells(ListRow, 2)
    
                Sheets("Errors").Cells(MisMatchCounter, 4).Value = Cells(ListRow, 3)
    
                Sheets("Errors").Cells(MisMatchCounter, 5).Value = Cells(ListRow, 4)
    
            End If
    
        End If
    
        On Error GoTo 0
    
        ListRow = ListRow + 1
    
    Loop
    

    Code Example 2:

    Sub CreateManualMatrix()
    
        Dim TableRow, TableColumn As Integer
    
        Dim TableEntry As String
    
        Dim CellToFill As Range
    
        'Sheet is called Lijst
    
        'Column A is names for top row
    
        'Column B is names for left column
    
        'Column C is value for Matrix
    
    
    
        'Matrix Top Row starts at H1
    
        'Matrix Left Column starts at G2
    
    
    
        MatrixLastColAddress = Range("H1").End(xlToRight).Address
    
        MatrixLastRow = Range("G65536").End(xlUp).Row
    
        LijstReadColumn = 3
    
        LijstCurrentRow = 2 'make 1 if no header is used
    
        Do Until Sheets("Lijst").Cells(LijstCurrentRow, 1).Value = ""
    
            ' Get table entry from third column of list.
    
            TableEntry = Sheets("Lijst").Cells(LijstCurrentRow, LijstReadColumn).Value
    
            ' Get position of Employee name within Matrix.
    
            TableColumn = Application.Match(Sheets("Lijst").Cells(LijstCurrentRow, 1), Range("H1:" & MatrixLastColAddress), 0)
    
            ' Get position of Qualification Name within Matrix titles.
    
            TableRow = Application.Match(Sheets("Lijst").Cells(LijstCurrentRow, 2), Range("G2:G" & MatrixLastRow), 0)
    
            Set CellToFill = Range("G1").Offset(TableRow, TableColumn)
    
            ' If there's already an entry in the cell, separate it from the new entry with a comma and space.
    
            If CellToFill.Value <> "" Then CellToFill.Value = CellToFill.Value & ","
    
            ' Add the new entry to the cell.
    
            CellToFill.Value = CellToFill.Value & TableEntry
    
            LijstCurrentRow = LijstCurrentRow + 1
    
        Loop
    
    End Sub
    
    0 讨论(0)
提交回复
热议问题