如何在查询选择oracle sql中设置表达式变量

如何在查询选择oracle sql中设置表达式变量,sql,oracle,oracle-sqldeveloper,Sql,Oracle,Oracle Sqldeveloper,我有如下Oracle SQL: SELECT z."date", z.id_outlet as idOutlet, z.name as outletName, z.matClass, z.targetBulanan, z.targetBulanan/totalVisit as targetAwal, z.actual,rownumber = tartot + rownumber as targetTotal FROM (SELECT

我有如下Oracle SQL:

SELECT  
z."date", z.id_outlet as idOutlet, z.name as outletName, z.matClass, z.targetBulanan, z.targetBulanan/totalVisit as targetAwal,
z.actual,rownumber = tartot + rownumber as targetTotal
                FROM (SELECT 
                b.visit_date as "date", a.id_outlet, max(o.name) as name, max(a.target_sales) as targetBulanan, a.id_material_class as matClass, 
                max(x.totalVisit) as totalVisit, NVL(SUM(d.billing_value),0) as actual 
                FROM (
                select * from target_bulanan 
                where deleted = 0 and enabled = 1 and id_salesman = :id_salesman AND id_material_class like :id_material_class AND id_outlet like :id_outlet AND month = TO_NUMBER(TO_CHAR(current_date,'mm')) and year = to_number(TO_CHAR(current_date,'YYYY')) 
                ) a 
                INNER JOIN outlet o ON o.id_outlet = a.id_outlet 
                LEFT JOIN visit_plan b ON b.deleted = 0 and a.id_salesman = b.id_salesman AND a.month =  TO_NUMBER(TO_CHAR(b.visit_date,'mm')) AND a.year = to_number(TO_CHAR(b.visit_date,'yyyy')) AND a.id_outlet = b.id_outlet 
                LEFT JOIN so_header c ON SUBSTR(c.id_to,'0',1) = 'TO' AND  a.id_salesman = c.id_salesman AND a.id_outlet = c.id_outlet 
                LEFT JOIN assign_billing d ON c.no_so_sap = d.no_so_sap AND d.billing_date = b.visit_date AND a.id_material_class = (SELECT id_material_class FROM material WHERE id = d.id_material) 
                LEFt JOIN (SELECT id_salesman, to_char(visit_date,'mm') as month, to_char(visit_date,'yyyy') as year, id_outlet, COUNT(*) as totalVisit  FROM visit_plan 
                WHERE deleted = 0 
                group by id_salesman, id_outlet,to_char(visit_date,'mm'), to_char(visit_date,'yyyy')) x on 
                x.id_salesman = a.id_salesman AND x.month =  a.month AND x.year = a.year AND x.id_outlet = a.id_outlet
                GROUP BY b.visit_date, a.id_outlet, a.id_material_class) z 
                CROSS JOIN (SELECT 0 as rownumber FROM DUAL ) r
                CROSS JOIN (SELECT 0 as tartot FROM DUAL ) t
                CROSS JOIN (SELECT '' as mat FROM DUAL ) m
                CROSS JOIN (SELECT '' as outlet FROM DUAL ) o
                ORDER by outletName, z.matClass, z."date"
我希望在select查询中rownumber的值是公式,但结果是此消息出错

ORA-00923:未在预期位置找到FROM关键字 92300000-“未在预期位置找到FROM关键字”


有人能帮我吗?谢谢

这解决了原来的问题

查询中可能存在多个问题。毕竟,调试和编写查询的最佳方法是从简单开始,逐渐增加复杂性

但是,你确实有一个明显的错误。在最外层的
中选择

SELECT z."date", z.id_outlet as idOutlet, z.name as outletName, 
       z.matClass, z.targetBulanan, z.targetBulanan/totalVisit as targetAwal,
       z.actual,
       rownumber = rownumber + 1 as row_number
=
不是Oracle语法——它看起来像是用于命名列的SQL Server扩展或MySQL变量的使用

我怀疑您想列举这些行。如果是这样,一种语法是
行号()

在Oracle中,您还可以执行以下操作:

       rownum as row_number
仅供列举- 更换线路

rownumber = rownumber + 1 AS row_number
用这个

rownum AS row_number
rownum是一个Oracle内置函数,它枚举结果集的每个记录,并自动递增

正如他在回答中提到的,您的问题还有很多

在第一次查看时(不执行),我可以列出有问题的行-

AND month = TO_NUMBER(TO_CHAR(current_date,'mm')) 
AND year = to_number(TO_CHAR(current_date,'YYYY'))
使用sysdate代替当前的\u日期

LEFT JOIN so_header c ON SUBSTR(c.id_to,'0',1) = 'TO'
我想,你是故意这么做的-

LEFT JOIN so_header c ON SUBSTR(c.id_to,0,2) = 'TO'
i、 e.从索引0到2个字符的子字符串


另外,不需要那些交叉连接

Yes,,但是rownumber是我为递增而创建的变量,就像我将它替换为变量x=x+2 rownumber,我的意思不是oracle中的函数,而是我从交叉连接创建的变量,,但是rownumber是我为increment创建的变量,就像我将它替换为变量x=x+2 rownumber一样,我指的不是oracle中的函数,而是我通过交叉连接创建的变量
LEFT JOIN so_header c ON SUBSTR(c.id_to,0,2) = 'TO'