我有这个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
有了这个结果:
但我需要实现这个目标:
Wanted table http://img32.imageshack.us/img32/9486/mjw7.png
功能ABI_StoreCardsWithMenu("Menu") SCWM
采用“菜单”列并返回右侧组。例如,在数据库中是“钉子”,并且此函数采用“钉子”的ID并返回组的名称 - &gt; “01.Potrubí是一个合适的人。”
为什么得到这么短的表的原因是,SQL查询在WHERE子句中使用条件。如果被选中的公司没有sc.id
属于第二组“02.Nářadí”,那么组将不会出现在结果表中。
我需要的是解决方案,它显示所有组,但我需要避免读取数据库中的每个记录(数据库是如此巨大,加载所有记录需要10-20分钟)。
答案 0 :(得分: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
您只需将其扩展为您的特定查询。