Вот так кто-то сделал в 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;
Давайте и мне поможем перевернуть SAS code в BASIC SQL
-
- Уже с Приветом
- Posts: 7935
- Joined: 08 Oct 2008 01:02
- Location: usa
-
- Уже с Приветом
- Posts: 8239
- Joined: 06 Feb 2002 10:01
- Location: NJ, USA
Re: Давайте и мне поможем перевернуть SAS code в BASIC SQL
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)
-
- Уже с Приветом
- Posts: 7935
- Joined: 08 Oct 2008 01:02
- Location: usa
Re: Давайте и мне поможем перевернуть SAS code в BASIC SQL
Поставила туда . Действительно, зараналось без возражений, но при проверке оказалось , что генерируются только три поля -даты и просчитанные дни
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 )
-
- Уже с Приветом
- Posts: 8239
- Joined: 06 Feb 2002 10:01
- Location: NJ, USA
Re: Давайте и мне поможем перевернуть SAS code в BASIC SQL
Это работает?
Теперь заменяем dte_effective на
и dte_end на
работает?
Оборачиваем в SELECT * from ( .....)
работает?
заменяем "SELECT *" на
получилось что хотели?
Code: Select all
SELECT id_medicaid, dte_effective, dte_end FROM allratecell
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
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