--mesinicio parameter goes here
IF 1 = 1
THEN
---cantmeses parameter also here
IF 1 = 1 ---Invalid SQL statement
THEN
SELECT a.ctainterna, a.ejercicio, a.cuenta, a.nombre, a.dapertura, a.hapertura,a.dene, a.hene,a.saldototal FROM mccont a WHERE a.ejercicio = '?EJ'
AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA)
ORDER BY DECODE('?O','1',CTAINTERNA), DECODE('?O','2',CUENTA);
ELSIF '?cantmeses' = 2 THEN
SELECT a.ctainterna, a.ejercicio, a.cuenta, a.nombre, a.dapertura, a.hapertura,a.dene, a.hene,a.dfeb, a.hfeb,a.saldototal FROM mccont a WHERE a.ejercicio = '?EJ'
AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA)
ORDER BY DECODE('?O','1',CTAINTERNA), DECODE('?O','2',CUENTA);
ELSIF '?cantmeses' = 3 THEN
SELECT a.ctainterna, a.ejercicio, a.cuenta, a.nombre, a.dapertura, a.hapertura,a.dene, a.hene,a.dfeb, a.hfeb,a.dmar, a.hmar,a.saldototal FROM mccont a WHERE a.ejercicio = '?EJ'
AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA)
ORDER BY DECODE('?O','1',CTAINTERNA), DECODE('?O','2',CUENTA);
ELSIF '?cantmeses' = 4 THEN
SELECT a.ctainterna, a.ejercicio, a.cuenta, a.nombre, a.dapertura, a.hapertura,a.dene, a.hene,a.dfeb, a.hfeb,a.dmar, a.hmar,a.dabr,
a.habr,a.saldototal FROM mccont a WHERE a.ejercicio = '?EJ'
AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA)
ORDER BY DECODE('?O','1',CTAINTERNA), DECODE('?O','2',CUENTA);
ELSIF '?cantmeses' = 5 THEN
SELECT a.ctainterna, a.ejercicio, a.cuenta, a.nombre, a.dapertura, a.hapertura,a.dene, a.hene,a.dfeb, a.hfeb,a.dmar, a.hmar,a.dabr,
a.habr,a.dmay, a.hmay,a.saldototal FROM mccont a WHERE a.ejercicio = '?EJ'
AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA)
ORDER BY DECODE('?O','1',CTAINTERNA), DECODE('?O','2',CUENTA);
ELSIF '?cantmeses' = 6 THEN
SELECT a.ctainterna, a.ejercicio, a.cuenta, a.nombre, a.dapertura, a.hapertura,a.dene, a.hene,a.dfeb, a.hfeb,a.dmar, a.hmar,a.dabr,
a.habr,a.dmay, a.hmay, a.djun, a.hjun, a.saldototal FROM mccont a WHERE a.ejercicio = '?EJ'
AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA)
ORDER BY DECODE('?O','1',CTAINTERNA), DECODE('?O','2',CUENTA);
ELSIF '?cantmeses' = 7 THEN
SELECT a.ctainterna, a.ejercicio, a.cuenta, a.nombre, a.dapertura, a.hapertura,a.dene, a.hene,a.dfeb, a.hfeb,a.dmar, a.hmar,a.dabr,
a.habr,a.dmay, a.hmay, a.djun, a.hjun,a.djul, a.hjul, a.saldototal FROM mccont a WHERE a.ejercicio = '?EJ'
AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA)
ORDER BY DECODE('?O','1',CTAINTERNA), DECODE('?O','2',CUENTA);
ELSIF '?cantmeses' = 8 THEN
SELECT a.ctainterna, a.ejercicio, a.cuenta, a.nombre, a.dapertura, a.hapertura,a.dene, a.hene,a.dfeb, a.hfeb,a.dmar, a.hmar,a.dabr,
a.habr,a.dmay, a.hmay, a.djun, a.hjun,a.djul, a.hjul,a.dago, a.hago, a.saldototal FROM mccont a WHERE a.ejercicio = '?EJ'
AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA)
ORDER BY DECODE('?O','1',CTAINTERNA), DECODE('?O','2',CUENTA);
ELSIF '?cantmeses' = 9 THEN
SELECT a.ctainterna, a.ejercicio, a.cuenta, a.nombre, a.dapertura, a.hapertura,a.dene, a.hene,a.dfeb, a.hfeb,a.dmar, a.hmar,a.dabr,
a.habr,a.dmay, a.hmay, a.djun, a.hjun,a.djul, a.hjul,a.dago, a.hago,a.dset, a.hset, a.saldototal FROM mccont a WHERE a.ejercicio = '?EJ'
AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA)
ORDER BY DECODE('?O','1',CTAINTERNA), DECODE('?O','2',CUENTA);
ELSIF '?cantmeses' = 10 THEN
SELECT a.ctainterna, a.ejercicio, a.cuenta, a.nombre, a.dapertura, a.hapertura,a.dene, a.hene,a.dfeb, a.hfeb,a.dmar, a.hmar,a.dabr,
a.habr,a.dmay, a.hmay, a.djun, a.hjun,a.djul, a.hjul,a.dago, a.hago,a.dset, a.hset,a.doct, a.hoct, a.saldototal FROM mccont a WHERE a.ejercicio = '?EJ'
AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA)
ORDER BY DECODE('?O','1',CTAINTERNA), DECODE('?O','2',CUENTA);
ELSIF '?cantmeses' = 11 THEN
SELECT a.ctainterna, a.ejercicio, a.cuenta, a.nombre, a.dapertura, a.hapertura,a.dene, a.hene,a.dfeb, a.hfeb,a.dmar, a.hmar,a.dabr,
a.habr,a.dmay, a.hmay, a.djun, a.hjun,a.djul, a.hjul,a.dago, a.hago,a.dset, a.hset,a.doct, a.hoct,a.dnov, a.hnov, a.saldototal FROM mccont a WHERE a.ejercicio = '?EJ'
AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA)
ORDER BY DECODE('?O','1',CTAINTERNA), DECODE('?O','2',CUENTA);
ELSIF '?cantmeses' = 12 THEN
SELECT a.ctainterna, a.ejercicio, a.cuenta, a.nombre, a.dapertura, a.hapertura,a.dene, a.hene,a.dfeb, a.hfeb,a.dmar, a.hmar,a.dabr,
a.habr,a.dmay, a.hmay, a.djun, a.hjun,a.djul, a.hjul,a.dago, a.hago,a.dset, a.hset,a.doct, a.hoct,a.dnov, a.hnov,a.ddic, a.hdic, a.saldototal FROM mccont a WHERE a.ejercicio = '?EJ'
AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA)
ORDER BY DECODE('?O','1',CTAINTERNA), DECODE('?O','2',CUENTA);
END IF;
--febrero
ELSIF '?mesinicio' = 2 THEN
IF '?cantmeses' = 1
THEN
SELECT a.ctainterna, a.ejercicio, a.cuenta, a.nombre, a.dapertura, a.hapertura,a.dfeb, a.hfeb,a.saldototal FROM mccont a WHERE a.ejercicio = '?EJ'
AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA)
ORDER BY DECODE('?O','1',CTAINTERNA), DECODE('?O','2',CUENTA);
ELSIF '?cantmeses' = 2 THEN
SELECT a.ctainterna, a.ejercicio, a.cuenta, a.nombre, a.dapertura, a.hapertura,a.dfeb, a.hfeb,a.dmar, a.hmar,a.saldototal FROM mccont a WHERE a.ejercicio = '?EJ'
AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA)
ORDER BY DECODE('?O','1',CTAINTERNA), DECODE('?O','2',CUENTA);
ELSIF '?cantmeses' = 3 THEN
SELECT a.ctainterna, a.ejercicio, a.cuenta, a.nombre, a.dapertura, a.hapertura,a.dfeb, a.hfeb,a.dmar, a.hmar, a.dabr,
a.habr,a.saldototal FROM mccont a WHERE a.ejercicio = '?EJ'
AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA)
ORDER BY DECODE('?O','1',CTAINTERNA), DECODE('?O','2',CUENTA);
ELSIF '?cantmeses' = 4 THEN
SELECT a.ctainterna, a.ejercicio, a.cuenta, a.nombre, a.dapertura, a.hapertura,a.dfeb, a.hfeb,a.dmar, a.hmar, a.dabr,
a.habr,a.dmay, a.hmay,a.saldototal FROM mccont a WHERE a.ejercicio = '?EJ'
AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA)
ORDER BY DECODE('?O','1',CTAINTERNA), DECODE('?O','2',CUENTA);
ELSIF '?cantmeses' = 5 THEN
SELECT a.ctainterna, a.ejercicio, a.cuenta, a.nombre, a.dapertura, a.hapertura,a.dfeb, a.hfeb,a.dmar, a.hmar, a.dabr,
a.habr,a.dmay, a.hmay,a.djun, a.hjun,a.saldototal FROM mccont a WHERE a.ejercicio = '?EJ'
AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA)
ORDER BY DECODE('?O','1',CTAINTERNA), DECODE('?O','2',CUENTA);
ELSIF '?cantmeses' = 6 THEN
SELECT a.ctainterna, a.ejercicio, a.cuenta, a.nombre, a.dapertura, a.hapertura,a.dfeb, a.hfeb,a.dmar, a.hmar, a.dabr,
a.habr,a.dmay, a.hmay,a.djun, a.hjun,a.djul, a.hjul,a.saldototal FROM mccont a WHERE a.ejercicio = '?EJ'
AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA)
ORDER BY DECODE('?O','1',CTAINTERNA), DECODE('?O','2',CUENTA);
ELSIF '?cantmeses' = 7 THEN
SELECT a.ctainterna, a.ejercicio, a.cuenta, a.nombre, a.dapertura, a.hapertura,a.dfeb, a.hfeb,a.dmar, a.hmar, a.dabr,
a.habr,a.dmay, a.hmay,a.djun, a.hjun,a.djul, a.hjul,a.dago, a.hago,a.saldototal FROM mccont a WHERE a.ejercicio = '?EJ'
AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA)
ORDER BY DECODE('?O','1',CTAINTERNA), DECODE('?O','2',CUENTA);
ELSIF '?cantmeses' = 8 THEN
SELECT a.ctainterna, a.ejercicio, a.cuenta, a.nombre, a.dapertura, a.hapertura,a.dfeb, a.hfeb,a.dmar, a.hmar, a.dabr,
a.habr,a.dmay, a.hmay,a.djun, a.hjun,a.djul, a.hjul,a.dago, a.hago,a.dset, a.hset,a.saldototal FROM mccont a WHERE a.ejercicio = '?EJ'
AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA)
ORDER BY DECODE('?O','1',CTAINTERNA), DECODE('?O','2',CUENTA);
ELSIF '?cantmeses' = 9 THEN
SELECT a.ctainterna, a.ejercicio, a.cuenta, a.nombre, a.dapertura, a.hapertura,a.dfeb, a.hfeb,a.dmar, a.hmar, a.dabr,
a.habr,a.dmay, a.hmay,a.djun, a.hjun,a.djul, a.hjul,a.dago, a.hago,a.dset, a.hset,a.doct, a.hoct,a.saldototal FROM mccont a WHERE a.ejercicio = '?EJ'
AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA)
ORDER BY DECODE('?O','1',CTAINTERNA), DECODE('?O','2',CUENTA);
ELSIF '?cantmeses' = 10 THEN
SELECT a.ctainterna, a.ejercicio, a.cuenta, a.nombre, a.dapertura, a.hapertura,a.dfeb, a.hfeb,a.dmar, a.hmar, a.dabr,
a.habr,a.dmay, a.hmay,a.djun, a.hjun,a.djul, a.hjul,a.dago, a.hago,a.dset, a.hset,a.doct, a.hoct, a.dnov, a.hnov,a.saldototal FROM mccont a WHERE a.ejercicio = '?EJ'
AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA)
ORDER BY DECODE('?O','1',CTAINTERNA), DECODE('?O','2',CUENTA);
ELSIF '?cantmeses' = 11 THEN
SELECT a.ctainterna, a.ejercicio, a.cuenta, a.nombre, a.dapertura, a.hapertura,a.dfeb, a.hfeb,a.dmar, a.hmar, a.dabr,
a.habr,a.dmay, a.hmay,a.djun, a.hjun,a.djul, a.hjul,a.dago, a.hago,a.dset, a.hset,a.doct, a.hoct, a.dnov, a.hnov,a.ddic, a.hdic,a.saldototal FROM mccont a WHERE a.ejercicio = '?EJ'
AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA)
ORDER BY DECODE('?O','1',CTAINTERNA), DECODE('?O','2',CUENTA);
ELSIF '?cantmeses' = 12 THEN
SELECT a.ctainterna, a.ejercicio, a.cuenta, a.nombre, a.dapertura, a.hapertura,a.dfeb, a.hfeb,a.dmar, a.hmar, a.dabr,
a.habr,a.dmay, a.hmay,a.djun, a.hjun,a.djul, a.hjul,a.dago, a.hago,a.dset, a.hset,a.doct, a.hoct, a.dnov, a.hnov,a.ddic, a.hdic,a.dene, a.hene,a.saldototal FROM mccont a WHERE a.ejercicio = '?EJ'
AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA)
ORDER BY DECODE('?O','1',CTAINTERNA), DECODE('?O','2',CUENTA);
END IF;
ELSE
select * from mccont;
END IF;
大家好,我正在尝试根据参数'mesinicio'和'cantmeses'对月份列进行排序
'mesinicio'用于开始的月份'cantmeses'用于月份数
我试图替换参数以测试其是否有效,并在第二个“ IF”中提示“无效的SQL语句”,并抛出错误和其他提示。我看不到我做错了什么,将不胜感激。谢谢
问候
在SQL中,您要查找的IF逻辑是CASE STATEMENT。
我建议使用CASE语句创建一个新的派生列,称为“过滤器”,该列标识具有指定条件的每一行。但是您只执行一次SELECT,就不会将SELECT嵌套在case语句中。
喜欢这个:
SELECT *
,CASE
WHEN '?cantmeses' = 1 AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA) THEN 'Condition 1'
WHEN '?cantmeses' = 2 AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA) THEN 'Condition 2'
....
ELSE 'No Condition'
END as "FILTER"
FROM TABLE
WHERE ...
;
看来您的逻辑可以简化为
SELECT *
FROM mccont a
WHERE a.ejercicio = '?EJ' AND
a.tipocta=DECODE('?CU',
1, 1,
0, 0,
2, a.TIPOCTA)
ORDER BY DECODE('?O',
'1', CTAINTERNA,
'2', CUENTA);
我对这张桌子的设计有个建议。您每个月都有两个字段(例如,一月数据为DENE和HENE,二月数据为DFEB和HFEB,三月数据为DMAR和HMAR,等等)。更好的选择是拥有一个头表和一个单独的月份数据,每个月的数据都存储在单独的行中-类似于
MCCONT
ID_MCCONT - primary key, NUMBER
CTAINTERNA
EJERCICIO
CUENTA
NOMBRE
DAPERTURA
HAPERTURA
SALDOTOTAL
MONTH_DATA
ID_MONTH_DATA - primary key, NUMBER
ID_MCCONT - NUMBER, NOT NULL, foreign key to MCCONT
MONTH_NAME VARCHAR2(15) NOT NULL
D_VAL Holds the data currently in DENE, DFEB, DMAR, etc.
H_VAL Holds the data currently in HENE, HFEB, HMAR, etc
这使您可以使用联接将数据放在一起,如
SELECT *
FROM MCCONT a
INNER JOIN MONTH_DATA b
ON b.ID_MCCONT = a.ID_MCCONT
这可能会使您的任务容易一些。