как использовать group by предложение с 'case' в запросе выбора ниже - PullRequest
0 голосов
/ 15 октября 2019

здесь мне нужно динамически сгруппировать предложение, как реализовать переключение регистра здесь

 SELECT
    COUNT(*) noofrecords,
    EXTRACT(MONTH FROM start_date) order_by,
    TO_CHAR(TO_DATE(EXTRACT(MONTH FROM start_date), 'MM'), 'month') value
FROM
    tab_name
WHERE
    EXTRACT(YEAR FROM start_date) = 2019
    AND CASE 'MONTH'  ----- getting this value from a variable
        WHEN 'MONTH'   THEN EXTRACT(MONTH FROM start_date)
    END = 2            ----- setting this value from a variable
GROUP BY
    CASE 'YEAR'    ----- getting this value from a variable 
        WHEN 'YEAR'   THEN EXTRACT(MONTH FROM start_date)
    END
ORDER BY
    order_by
    enter code here

Ответы [ 2 ]

0 голосов
/ 15 октября 2019

Я бы предложил использовать подзапрос для определения столбцов на основе переменных, а затем агрегировать и упорядочивать их.

Примерно так:

SELECT COUNT(*) as noofrecords, order_by, value
FROM (SELECT t.*,
             TO_CHAR(TO_DATE(EXTRACT(MONTH FROM start_date), 'MM'), 'month') as value
             EXTRACT(MONTH FROM start_date) as order_by
             (CASE 'YEAR'    ----- getting this value from a variable 
                   WHEN 'YEAR' THEN EXTRACT(MONTH FROM start_date)
              END) as grouping_var
    END
             (CASE 'MONTH'  ----- getting this value from a variable
                  WHEN 'MONTH' THEN EXTRACT(MONTH FROM start_date)
              END) as filter_criteria
      FROM tab_name
      WHERE EXTRACT(YEAR FROM start_date) = 2019
     ) t
WHERE filter_column = 2  ----- setting this value from a
GROUP BY grouping_var, order_by, value
ORDER BY order_by;

Запрос не 'это точно имеет смысл. Но я подозреваю, что когда вы подадите заявление о своей проблеме, вы увидите, как этот подход помогает.

0 голосов
/ 15 октября 2019

Вы должны иметь все выражения в предложении SELECT, которые будут либо функциями агрегирования, либо в предложении GROUP BY:

DECLARE
  p_cursor      SYS_REFCURSOR;
  p_start_units VARCHAR2(10) := 'YEAR';
  p_year        NUMBER       := 2019;
  p_month       NUMBER       := 2;

  p_out_month   VARCHAR2(10);
  p_out_count   NUMBER;
BEGIN
  OPEN p_cursor FOR
  SELECT COUNT(*) noofrecords,
         TO_CHAR(
           CASE p_start_units
           WHEN 'YEAR' THEN TRUNC( start_date, 'MM' )
           END,
           'month'
         ) AS value
  FROM   tab_name
  WHERE  EXTRACT(YEAR FROM start_date) = p_year
  AND    CASE 'MONTH'
         WHEN 'MONTH' THEN EXTRACT(MONTH FROM start_date)
         END = p_month
  GROUP BY
         CASE p_start_units
         WHEN 'YEAR' THEN TRUNC( start_date, 'MM' )
         END
  ORDER BY
         CASE p_start_units
         WHEN 'YEAR' THEN TRUNC( start_date, 'MM' )
         END;

  LOOP
    FETCH p_cursor INTO p_out_count, p_out_month;
    EXIT WHEN p_cursor%NOTFOUND;

    DBMS_OUTPUT.PUT_LINE( p_out_month || ': ' || p_out_count );
  END LOOP;
END;
/

Тестовые данные :

CREATE TABLE tab_name ( start_date ) AS
  SELECT DATE '2019-01-01' FROM DUAL UNION ALL
  SELECT DATE '2019-01-01' FROM DUAL UNION ALL
  SELECT DATE '2019-02-01' FROM DUAL UNION ALL
  SELECT DATE '2019-02-01' FROM DUAL UNION ALL
  SELECT DATE '2019-02-01' FROM DUAL UNION ALL
  SELECT DATE '2019-03-01' FROM DUAL;

Выход :

february : 3

дБ <> скрипка здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...