=== share/html/Search/Chart
==================================================================
--- share/html/Search/Chart	(revision 20100)
+++ share/html/Search/Chart	(local)
@@ -68,10 +68,9 @@
 
 use RT::Report::Tickets;
 my $tix = RT::Report::Tickets->new( $session{'CurrentUser'} );
-$tix->FromSQL( $Query );
-my $count_name = $tix->Column( FUNCTION => 'COUNT', FIELD => 'id' );
-$tix->GroupBy( FIELD => $PrimaryGroupBy );
-my $value_name = $tix->Column( FIELD => $PrimaryGroupBy );
+my ($count_name, $value_name) = $tix->SetupGroupings(
+    Query => $Query, GroupBy => $PrimaryGroupBy,
+);
 
 my $chart = $chart_class->new( 600 => 400 );
 
=== share/html/Search/Elements/Chart
==================================================================
--- share/html/Search/Elements/Chart	(revision 20100)
+++ share/html/Search/Elements/Chart	(local)
@@ -54,10 +54,9 @@
 <%init>
 use RT::Report::Tickets;
 my $tix = RT::Report::Tickets->new( $session{'CurrentUser'} );
-$tix->FromSQL( $Query );
-my $count_name = $tix->Column( FUNCTION => 'COUNT', FIELD => 'id' );
-$tix->GroupBy( FIELD => $PrimaryGroupBy );
-my $value_name = $tix->Column( FIELD => $PrimaryGroupBy );
+my ($count_name, $value_name) = $tix->SetupGroupings(
+    Query => $Query, GroupBy => $PrimaryGroupBy,
+);
 
 my %class = (
     Queue => 'RT::Queue',
=== lib/RT/Report/Tickets.pm
==================================================================
--- lib/RT/Report/Tickets.pm	(revision 20100)
+++ lib/RT/Report/Tickets.pm	(local)
@@ -119,11 +119,28 @@
     return $self->CurrentUser->loc($field);
 }
 
+sub SetupGroupings {
+    my $self = shift;
+    my %args = (Query => undef, GroupBy => undef, @_);
+
+    $self->FromSQL( $args{'Query'} );
+    my @group_by = ref( $args{'GroupBy'} )? @{ $args{'GroupBy'} } : ($args{'GroupBy'});
+    $self->GroupBy( FIELD => $_ ) foreach @group_by;
+
+    # UseSQLForACLChecks may add late joins
+    my $joined = ($self->_isJoined || RT->Config->Get('UseSQLForACLChecks')) ? 1 : 0;
+
+    my @res;
+    push @res, $self->Column( FUNCTION => ($joined? 'DISTINCT COUNT' : 'COUNT'), FIELD => 'id' );
+    push @res, map $self->Column( FIELD => $_ ), @group_by;
+    return @res;
+}
+
 sub GroupBy {
     my $self = shift;
     my %args = ref $_[0]? %{ $_[0] }: (@_);
 
-    $self->{'_group_by_field'} = $args{'FIELD'};
+    push @{ $self->{'_group_by_field'} ||= [] }, $args{'FIELD'};
     %args = $self->_FieldToFunction( %args );
 
     $self->SUPER::GroupBy( \%args );
@@ -252,7 +269,7 @@
 
 sub AddEmptyRows {
     my $self = shift;
-    if ( $self->{'_group_by_field'} eq 'Status' ) {
+    if ( @{ $self->{'_group_by_field'} || [] } == 1 && $self->{'_group_by_field'}[0] eq 'Status' ) {
         my %has = map { $_->__Value('Status') => 1 } @{ $self->ItemsArrayRef || [] };
 
         foreach my $status ( grep !$has{$_}, RT::Queue->new($self->CurrentUser)->StatusArray ) {