我需要创建一个引用多个表的报表,包括一个表,它是订单的逐行详细信息。在订单上,我们有包,唯一的方法来确定包是否具有某种状态是分析它的组件成员的状态。发票明细按顺序存储,每行的行号和项目级别。带有itemlevel的条目> 1是紧接在它们之前的套件的一部分。所以,例如:
Invoiceiid | Lineno | LevelNo | SKU
----------------------------------------------------
10192 | 1 | 1 | K-PACKAGE
10192 | 2 | 2 | SCREEN
10192 | 3 | 2 | CABLE
10192 | 4 | 1 | LCD PROJECTOR
在此示例中,SCREEN和CABLE是K-PACKAGE的一部分,而LCD PROJECTOR则不是。
我根据组件的状态修改这些包的状态。就我的目的而言,平均状态正常。我将下面包含的命令作为我正在使用的SQL查询的较小版本(较大的版本只是处理多个子项的强力方法)。该命令在数据库专家,编辑命令屏幕中被接受,但实际上尝试预览报告返回
“数据库连接器错误:'HY000:[Oracle] [ODBC] [Ora] ORA-01427:单行子查询返回多行[数据库供应商代码:1427]'”
当它真正开始尝试提取结果时。
这是我用来尝试找到问题的简短SQL查询。现在,我只是展示利润中心,试着看看是不是问题。
select ih.billdate, ih.invoiceid, ih.profitcenter, co.contractid, il.action,
(
case il.status
when 15 then
(
case when (((select il2.itemlevel from invoiceline il2 where il2.invoiceiid = il.invoiceiid and il2.lineno = (il.lineno + 1)) = 1) or ((select count(il2.itemlevel) from invoiceline il2 where il2.invoiceiid = il.invoiceiid and il2.lineno = (il.lineno + 1)) = 0))
then 15
when (((select max(il2.lineno) from invoiceline il2 where il2.invoiceiid = il.invoiceiid) <= (il.lineno + 2)))
then (select il5.status from invoiceline il5 where il5.invoiceiid = il.invoiceiid and il5.lineno = (il.lineno + 1))
else
15
end
)
else
il.status
end
) as "Status",
il.amount, il.discountamount, im.revenuegroup, im.subrentalexpense, im.discountgroup, im.subrentglcode, im.sellglcode from invoicehead ih inner join contract co on ih.contractiid = co.contractiid left outer join invoiceline il on ih.invoiceiid = il.invoiceiid inner join invmaster im on il.inviid = im.invi
如果我改变
then (select il5.status from invoiceline il5 where il5.invoiceiid = il.invoiceiid and il5.lineno = (il.lineno + 1))
只提供一个严格的数字(例如15),报告预览没有问题。
只是在传递中解决问题:主包项和组件之间没有其他引用(至少我找不到),也不能更改数据库模式。一切都必须在Crystal Reports中。
有什么想法吗?
答案 0 :(得分:1)
好像你有相同的记录(Invoiceiid,Lineno),你可以查看下面的查询:
SELECT invoiceiid, lineno, COUNT(*)
FROM invoiceline
GROUP BY invoiceiid, lineno
HAVING COUNT(*) > 1
如果是这种情况,我建议您更正数据,然后在(Invoiceiid,Lineno)上添加UNIQUE CONSTRAINT
@Michael:在回复您的评论时:如果您无法更正数据,则必须在遇到重复时决定该怎么做。例如,您可以修改子查询il2
和il5
,以便他们返回最多一行,例如将SELECT il2.itemlevel
替换为SELECT MAX(il2.itemlevel)
。
您还可以使用分析来读取下一行的值(它将比子查询更有效):
SELECT ih.billdate, ih.invoiceid, ih.profitcenter, co.contractid, il.action,
(CASE il.status
WHEN 15 THEN
(CASE
WHEN LEAD(il2.itemlevel) OVER(PARTITION BY invoiceiid ORDER BY lineno) IS NULL THEN
15
WHEN MAX(il2.lineno) OVER(PARTITION BY invoiceiid) <= il.lineno + 2 THEN
LEAD(il5.status) OVER(PARTITION BY invoiceiid ORDER BY lineno)
ELSE
15
END)
ELSE
il.status
END) AS "Status", il.amount, il.discountamount, im.revenuegroup, im.subrentalexpense, im.discountgroup,
im.subrentglcode, im.sellglcode
FROM invoicehead ih
INNER JOIN contract co ON ih.contractiid = co.contractiid
LEFT OUTER JOIN invoiceline il ON ih.invoiceiid = il.invoiceiid
INNER JOIN invmaster im ON il.inviid = im.invi
答案 1 :(得分:0)
感谢文森特......事实证明,出现这种情况有两个不同的原因。一个是我确实有重复的条目,因为文森特指出,我能够修复它们。
另一个问题是我假设NULL
值转到0
(在这种情况下他们没有)并且我的边界没有正确设置。调整我的异常条件后,我能够使代码正常工作。非常感谢!