class_docstr: Renders an SQL plan following ANSI SQL.
class_docstr_tok: ["Renders","an","SQL","plan","following","ANSI","SQL","."]
docstr: Convert the group by columns into a "GROUP BY" section.
  
  e.g.
  GROUP BY
    a.ds
  
  Returns a tuple of the "GROUP BY" section as a string and the associated execution parameters.
docstr_tok: ["Convert","the","group","by","columns","into","a","``","GROUP","BY","''","section",".","e.g",".","GROUP","BY","a.ds","Returns","a","tuple","of","the","``","GROUP","BY","''","section","as","a","string","and","the","associated","execution","parameters","."]
code: def _render_group_by_section(
      self, group_by_columns: Sequence[SqlSelectColumn]
  ) -> Tuple[str, SqlBindParameters]:
      """Convert the group by columns into a "GROUP BY" section.
  
      e.g.
      GROUP BY
        a.ds
  
      Returns a tuple of the "GROUP BY" section as a string and the associated execution parameters.
      """
      group_by_section_lines: List[str] = []
      params = SqlBindParameters()
      first = True
      for group_by_column in group_by_columns:
          group_by_expr_rendered = (
              self.EXPR_RENDERER.render_group_by_expr(group_by_column)
          )
          params = params.combine(
              group_by_expr_rendered.bind_parameters
          )
          if first:
              first = False
              group_by_section_lines.append("GROUP BY")
              group_by_section_lines.append(
                  textwrap.indent(
                      group_by_expr_rendered.sql, prefix=self.INDENT
                  )
              )
          else:
              group_by_section_lines.append(
                  textwrap.indent(
                      f", {group_by_expr_rendered.sql}",
                      prefix=self.INDENT,
                  )
              )
  
      return "\n".join(group_by_section_lines), params
  
imports: from __future__ import annotations
  import logging
  import textwrap
  from abc import ABC, abstractmethod
  from dataclasses import dataclass
  from typing import List, Optional, Sequence, Tuple
  from metricflow.sql.render.expr_renderer import DefaultSqlExpressionRenderer, SqlExpressionRenderer, SqlExpressionRenderResult
  from metricflow.sql.sql_bind_parameters import SqlBindParameters
  from metricflow.sql.sql_plan import SqlJoinDescription, SqlQueryPlan, SqlQueryPlanNode, SqlQueryPlanNodeVisitor, SqlSelectColumn, SqlSelectQueryFromClauseNode, SqlSelectStatementNode, SqlTableFromClauseNode
label_desc: Use image node_id 4 for calling the DefaultSqlQueryPlanRenderer obj's underlying member method code with example usage: obj._render_group_by_section(group_by_columns) and returns: str,  params