1

我有这个 sql 查询:

select "Amount",
    "Month",
    SCWM.out_menu1Text
from
(select sum(II2.LocalTAmountWithoutVAT) as "Amount",
    ib_string_right('00' || ib_decodedate_month(II.docdate$date), 2) as "Month",
    sc.id as "Menu"
from IssuedInvoices2 II2
join IssuedInvoices II on II.id = II2.parent_id
left join StoreCards SC on SC.ID = II2.StoreCard_ID
left join firms F on F.id = II.firm_id
where
    ib_decodedate_year(II.docdate$date) = (EXTRACT(YEAR FROM CURRENT_DATE))
    and ib_decodedate_month(II.docdate$date) >= @{_od}
    and ib_decodedate_month(II.docdate$date) <= @{_do}
    and F.id = '@{_firmID}'
group by
    ib_string_right('00' || ib_decodedate_month(II.docdate$date), 2),
    "Menu")
left join ABI_StoreCardsWithMenu("Menu") SCWM on SCWM.OUT_StoreCard_ID = "Menu"
order by
    SCWM.out_menu1Text

结果:

结果表

但我需要实现这一点:

通缉表 http://img32.imageshack.us/img32/9486/mjw7.png

函数ABI_StoreCardsWithMenu("Menu") SCWM采用“菜单”列并返回右组。例如,在数据库中是“nail”,此函数获取“nail”的 ID 并返回组的名称 -->“01. Potrubí a fitinky”。

得到这么短的表的原因是,SQL 查询在 WHERE 子句中使用了条件。如果选定的公司没有sc.id属于第二组“02.Nářadí”,则该组将不会出现在结果表中。

我需要的是显示所有组的解决方案,但我需要避免读取数据库中的每条记录(数据库非常庞大,加载所有记录需要 10-20 分钟)。

4

1 回答 1

1

您需要获取所有项目的列表,然后获取LEFT JOIN当前查询(进行一些修改)。

例如,假设您有一个ITEMS包含所有项目名称的表(而不是一个表,这也可以是一个(子)查询、视图或可选过程),以及一个NUMBEROFITEMS包含项目计数的表(同样,这也可以是一个(子) )查询、查看或可选择的程序)。

ITEMS包含:

{ { ID=1, NAME='Item 1'}, { ID=2, NAME='Item 2'} }

并且NUMBEROFITEMS

{ { ITEMID=1, ITEMCOUNT=35 } }

然后,您可以使用以下查询生成完整列表:

SELECT
    i.NAME,
    COALESCE(ni.ITEMCOUNT, 0)
FROM ITEMS i
LEFT JOIN NUMBEROFITEMS ni ON ni.ITEMID = i.ID

您只需要将其扩展到您的特定查询。

于 2013-06-22T06:59:28.580 回答