Давайте и мне поможем перевернуть SAS code в BASIC SQL

User avatar
shokoladnitsaa
Уже с Приветом
Posts: 7935
Joined: 08 Oct 2008 01:02
Location: usa

Давайте и мне поможем перевернуть SAS code в BASIC SQL

Post by shokoladnitsaa »

Вот так кто-то сделал в SAS:

data mytable;
set have;
IF elig.DTE_Effective < TO_DATE('01MAR2018') THEN elig.DTE_Effective=TO_DATE('01MAR2018');
IF elig.DTE_Effective > TO_DATE('30JUN2018') then elig.DTE_Effective=elig.DTE_End;
IF elig.DTE_END < TO_DATE('01MAR2018') then elig.DTE_END=TO_DATE('01MAR2018');
IF elig.DTE_END > TO_DATE('30JUN2018') then elig.DTE_END=TO_DATE('30JUN2018');

num_days_elig2 = datdif(datepart(dte_effective), datepart(dte_end), 'ACT/ACT') + 1;
run;

А вот это типа хочу , но не выходит сделать в ORACLE SQL (under TOAD ....если это имеет значение)

CREATE TABLE mytable as
SELECT DISTINCT
Field 1.
Field2,
/*case conditions*/
/*calc line*/
FROM have
quit;
User avatar
Uzito
Уже с Приветом
Posts: 8239
Joined: 06 Feb 2002 10:01
Location: NJ, USA

Re: Давайте и мне поможем перевернуть SAS code в BASIC SQL

Post by Uzito »

Code: Select all

WITH elig                                                         -- test data
     AS (SELECT TO_DATE ('01-APR-2018') dfe_effective,
                TO_DATE ('01-SEP-2018') dte_end
           FROM DUAL
         UNION ALL
         SELECT TO_DATE ('01-JAN-2018') dfe_effective,
                TO_DATE ('01-MAY-2018') dte_end
           FROM DUAL)
SELECT dfe_effective, dte_end, dte_end - dfe_effective + 1 elig_days
  FROM (SELECT (CASE
                   WHEN elig.dfe_effective < TO_DATE ('01-MAR-2018')
                   THEN
                      TO_DATE ('01-MAR-2018')
                   WHEN elig.dfe_effective > TO_DATE ('30-JUN-2018')
                   THEN
                      elig.dte_end
                   ELSE                                         -- missed case
                      elig.dfe_effective
                END)
                  dfe_effective,
               (CASE
                   WHEN elig.dte_end < TO_DATE ('01-MAR-2018')
                   THEN
                      TO_DATE ('01-MAR-2018')
                   WHEN elig.dte_end > TO_DATE ('30-JUN-2018')
                   THEN
                      TO_DATE ('30-JUN-2018')
                   ELSE                                         -- missed case
                      elig.dte_end
                END)
                  dte_end
          FROM elig)
User avatar
shokoladnitsaa
Уже с Приветом
Posts: 7935
Joined: 08 Oct 2008 01:02
Location: usa

Re: Давайте и мне поможем перевернуть SAS code в BASIC SQL

Post by shokoladnitsaa »

Uzito wrote: 31 Jul 2018 16:31ну так нужно это ID добавить... скажем между ") dte_end" и "FROM ALLRATECELL"
Поставила туда . Действительно, зараналось без возражений, но при проверке оказалось , что генерируются только три поля -даты и просчитанные дни
select * from ALLRATECELL _dt where ROWNUM <= 100

Ой, наверное надо в двух местах поставить. Проранаю и доложусь



НЕ ВЫХОДИТ :(



FROM (SELECT (CASE
WHEN ALLRATECELL.dte_effective < TO_DATE ('01-MAR-2018')
THEN
TO_DATE ('01-MAR-2018')
WHEN ALLRATECELL.dte_effective > TO_DATE ('30-JUN-2018')
THEN
ALLRATECELL.dte_end
ELSE -- missed case
ALLRATECELL.dte_effective
END)
dte_effective,
id_medicaid ---- ругается на Айди е как на инвалидный айдентифайер
(CASE
WHEN ALLRATECELL.dte_end < TO_DATE ('01-MAR-2018')
THEN
TO_DATE ('01-MAR-2018')
WHEN ALLRATECELL.dte_end > TO_DATE ('30-JUN-2018')
THEN
TO_DATE ('30-JUN-2018')
ELSE -- missed case
ALLRATECELL.dte_end
END)
dte_end,
id_medicaid -- а м/у END и FROM не жалуется, но нагло игнорирует
FROM ALLRATECELL )
User avatar
Uzito
Уже с Приветом
Posts: 8239
Joined: 06 Feb 2002 10:01
Location: NJ, USA

Re: Давайте и мне поможем перевернуть SAS code в BASIC SQL

Post by Uzito »

Это работает?

Code: Select all

SELECT id_medicaid, dte_effective, dte_end FROM allratecell
Теперь заменяем dte_effective на

Code: Select all

(CASE
                   WHEN elig.dfe_effective < TO_DATE ('01-MAR-2018')
                   THEN
                      TO_DATE ('01-MAR-2018')
                   WHEN elig.dfe_effective > TO_DATE ('30-JUN-2018')
                   THEN
                      elig.dte_end
                   ELSE                                         -- missed case
                      elig.dfe_effective
                END)
                  dfe_effective
и dte_end на

Code: Select all

(CASE
                   WHEN elig.dte_end < TO_DATE ('01-MAR-2018')
                   THEN
                      TO_DATE ('01-MAR-2018')
                   WHEN elig.dte_end > TO_DATE ('30-JUN-2018')
                   THEN
                      TO_DATE ('30-JUN-2018')
                   ELSE                                         -- missed case
                      elig.dte_end
                END)
                  dte_end
работает?

Оборачиваем в SELECT * from ( .....)

работает?

заменяем "SELECT *" на

Code: Select all

SELECT id_medicaid, dfe_effective, dte_end, dte_end - dfe_effective + 1 elig_days
получилось что хотели?

Return to “Вопросы и новости IT”