порядок по пункту desc, путаясь между годами и месяцами - PullRequest
0 голосов
/ 12 февраля 2019

Мне нужно отсортировать гарантию в порядке убывания, но это дает мне сначала месяцы, потому что большее число, а затем год снизу, потому что число для года равно 1.

  SELECT product_name_us product_name_us,
         product_desc_us product_desc_us,
         product_name_ru product_name_ru,
         product_desc_ru product_desc_ru,
         "Warranty",
         in_stock in_stock
    FROM (  SELECT DISTINCT
                   CASE
                      WHEN pd.language_id = 'US'
                      THEN
                         COALESCE (TO_CHAR (pd.translated_name), ' ')
                   END
                      AS product_name_us,
                   CASE
                      WHEN pd.language_id = 'US'
                      THEN
                         CONCAT (SUBSTR (pd.translated_description, 1, 30),
                                 '...')
                   END
                      AS product_desc_us,
                   CASE
                      WHEN pd.language_id = 'RU'
                      THEN
                         COALESCE (TO_CHAR (pd.translated_name), ' ')
                   END
                      AS product_name_ru,
                   CASE
                      WHEN pd.language_id = 'RU'
                      THEN
                         CONCAT (SUBSTR (pd.translated_description, 1, 30),
                                 '...')
                   END
                      AS product_desc_ru,
                   CASE
                      WHEN pin.warranty_period = '00-00'
                      THEN
                         'No Warranty'
                      WHEN EXTRACT (MONTH FROM pin.warranty_period) = '00'
                      THEN
                         EXTRACT (YEAR FROM pin.warranty_period) || ' years'
                      WHEN EXTRACT (YEAR FROM pin.warranty_period) = '00'
                      THEN
                         EXTRACT (MONTH FROM pin.warranty_period) || ' months'
                      WHEN     EXTRACT (MONTH FROM pin.warranty_period) <> '00'
                           AND EXTRACT (YEAR FROM pin.warranty_period) <> '00'
                      THEN
                            EXTRACT (YEAR FROM pin.warranty_period)
                         || ' years and '
                         || EXTRACT (MONTH FROM pin.warranty_period)
                         || ' months'
                      ELSE
                         'No Warranty'
                   END
                      AS "Warranty",
                   SUM (inv.quantity_on_hand) AS in_stock
              FROM product_descriptions pd
                   INNER JOIN product_information pin
                      ON pd.product_id = pin.product_id
                   INNER JOIN inventories inv ON inv.product_id = pin.product_id
          GROUP BY pd.translated_name,
                   CASE
                      WHEN pd.language_id = 'US'
                      THEN
                         COALESCE (TO_CHAR (pd.translated_name), ' ')
                   END,
                   CASE
                      WHEN pd.language_id = 'US'
                      THEN
                         CONCAT (SUBSTR (pd.translated_description, 1, 30),
                                 '...')
                   END,
                   CASE
                      WHEN pd.language_id = 'RU'
                      THEN
                         COALESCE (TO_CHAR (pd.translated_name), ' ')
                   END,
                   CASE
                      WHEN pd.language_id = 'RU'
                      THEN
                         CONCAT (SUBSTR (pd.translated_description, 1, 30),
                                 '...')
                   END,
                   CASE
                      WHEN pin.warranty_period = '00-00'
                      THEN
                         'No Warranty'
                      WHEN EXTRACT (MONTH FROM pin.warranty_period) = '00'
                      THEN
                         EXTRACT (YEAR FROM pin.warranty_period) || ' years'
                      WHEN EXTRACT (YEAR FROM pin.warranty_period) = '00'
                      THEN
                         EXTRACT (MONTH FROM pin.warranty_period) || ' months'
                      WHEN     EXTRACT (MONTH FROM pin.warranty_period) <> '00'
                           AND EXTRACT (YEAR FROM pin.warranty_period) <> '00'
                      THEN
                            EXTRACT (YEAR FROM pin.warranty_period)
                         || ' years and '
                         || EXTRACT (MONTH FROM pin.warranty_period)
                         || ' months'
                      ELSE
                         'No Warranty'
                   END)
   WHERE     (   product_name_us LIKE '%Monitor%'
              OR product_name_ru LIKE '%Монитор%')
         AND in_stock < 1000
ORDER BY "Warranty" DESC, product_name_us ASC;

1 Ответ

0 голосов
/ 12 февраля 2019

Вам нужно будет кодировать предложение ORDER BY.Вот пример того, как вы можете попытаться сделать это:

SQL> with test (warranty) as
  2    (select 'No Warranty' from dual union all
  3     select '13 years'    from dual union all
  4     select '8 months'    from dual union all
  5     select '2 years and 4 months' from dual
  6    )
  7  select warranty
  8  from test
  9  order by case when warranty = 'No Warranty' then 1 end,
 10           case when instr(warranty, 'years') = 0 then 1 else 2 end,
 11           to_number(regexp_substr(warranty, '\d+', 1, 1)),
 12           to_number(regexp_substr(warranty, '\d+', 1, 2))
 13  /

WARRANTY
--------------------
No Warranty
8 months
2 years and 4 months
13 years

SQL>
  • строка 9: «Нет гарантии» идет первым
  • строка 10: если гарантия не содержит «лет»", он должен стоять первым (т. е. это только месяцы)
  • строка 11: взять первое число в" гарантии "(т. е. лет )
  • строка 12: принятьвторой номер в «гарантии» (т.е. месяцев )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...