diff --git a/addons/pos_sale/report/sale_report.py b/addons/pos_sale/report/sale_report.py
index ac9bed1fad6ef0cebcd88c660d09ede9db06ce08..cda5e0b6d330a9698bdc96a58228ef219d2065c7 100644
--- a/addons/pos_sale/report/sale_report.py
+++ b/addons/pos_sale/report/sale_report.py
@@ -19,9 +19,9 @@ class SaleReport(models.Model):
                                             ('pos_done', 'Posted'),
                                             ('invoiced', 'Invoiced')], string='Status', readonly=True)
 
-    def _query(self, with_clause='', fields={}, groupby='', from_clause=''):
-        res = super(SaleReport, self)._query(with_clause, fields, groupby, from_clause)
-
+    def _select_pos(self, fields=None):
+        if not fields:
+            fields = {}
         select_ = '''
             MIN(l.id) AS id,
             l.product_id AS product_id,
@@ -62,7 +62,9 @@ class SaleReport(models.Model):
 
         for field in fields.keys():
             select_ += ', NULL AS %s' % (field)
+        return select_
 
+    def _from_pos(self):
         from_ = '''
             pos_order_line l
                   join pos_order pos on (l.order_id=pos.id)
@@ -74,7 +76,9 @@ class SaleReport(models.Model):
                     LEFT JOIN pos_config config ON (config.id = session.config_id)
                 left join product_pricelist pp on (pos.pricelist_id = pp.id)
         '''
+        return from_
 
+    def _group_by_pos(self):
         groupby_ = '''
             l.order_id,
             l.product_id,
@@ -97,6 +101,13 @@ class SaleReport(models.Model):
             u.factor,
             pos.crm_team_id
         '''
-        current = '(SELECT %s FROM %s GROUP BY %s)' % (select_, from_, groupby_)
+        return groupby_
+
+    def _query(self, with_clause='', fields=None, groupby='', from_clause=''):
+        if not fields:
+            fields = {}
+        res = super()._query(with_clause, fields, groupby, from_clause)
+        current = '(SELECT %s FROM %s GROUP BY %s)' % \
+                  (self._select_pos(fields), self._from_pos(), self._group_by_pos())
 
         return '%s UNION ALL %s' % (res, current)
diff --git a/addons/sale/report/sale_report.py b/addons/sale/report/sale_report.py
index 76ec14762917a4e2e8db19fd412a33b0779bc622..db5e9c71db5f2eebae78508833fd3c153089da99 100644
--- a/addons/sale/report/sale_report.py
+++ b/addons/sale/report/sale_report.py
@@ -58,9 +58,9 @@ class SaleReport(models.Model):
 
     order_id = fields.Many2one('sale.order', 'Order #', readonly=True)
 
-    def _query(self, with_clause='', fields={}, groupby='', from_clause=''):
-        with_ = ("WITH %s" % with_clause) if with_clause else ""
-
+    def _select_sale(self, fields=None):
+        if not fields:
+            fields = {}
         select_ = """
             coalesce(min(l.id), -s.id) as id,
             l.product_id as product_id,
@@ -101,7 +101,9 @@ class SaleReport(models.Model):
 
         for field in fields.values():
             select_ += field
+        return select_
 
+    def _from_sale(self, from_clause=''):
         from_ = """
                 sale_order_line l
                       right outer join sale_order s on (s.id=l.order_id)
@@ -113,7 +115,9 @@ class SaleReport(models.Model):
                     left join product_pricelist pp on (s.pricelist_id = pp.id)
                 %s
         """ % from_clause
+        return from_
 
+    def _group_by_sale(self, groupby=''):
         groupby_ = """
             l.product_id,
             l.order_id,
@@ -138,8 +142,14 @@ class SaleReport(models.Model):
             l.discount,
             s.id %s
         """ % (groupby)
+        return groupby_
 
-        return '%s (SELECT %s FROM %s GROUP BY %s)' % (with_, select_, from_, groupby_)
+    def _query(self, with_clause='', fields=None, groupby='', from_clause=''):
+        if not fields:
+            fields = {}
+        with_ = ("WITH %s" % with_clause) if with_clause else ""
+        return '%s (SELECT %s FROM %s GROUP BY %s)' % \
+               (with_, self._select_sale(fields), self._from_sale(from_clause), self._group_by_sale(groupby))
 
     def init(self):
         # self._table = sale_report