在用ireport只做报表时,客户要求显示至少十行数据,不足十行时,显示空行。
ireport的数据源是数据库sql,一般情况就是查出来,是多少就显示多少。现在这个报表,需要嵌入子表,如果头表只有一条或数据比较少时,头行之间的空表会比较难看,所以要求显示空行信息。
- 数据少于10条
1)普通SQL查询
SELECT ITEM_ID || '' ITEM_ID, ITEM_CODE, DESCRIPTIONS
FROM MTL_ITEMS
WHERE ITEM_ID IN (17721, 17239)
2)查询结果
3)补充行SQL查询
SELECT ITEM_ID || '' ITEM_ID, ITEM_CODE, DESCRIPTIONS
FROM MTL_ITEMS
WHERE ITEM_ID IN (17721, 17239)
UNION ALL
SELECT '', '', ''
FROM DUAL
WHERE (CASE
WHEN (SELECT COUNT(1) FROM MTL_ITEMS WHERE ITEM_ID IN (17721, 17239)) >= 10 THEN
2
ELSE
1
END) = 1
CONNECT BY LEVEL <
(11 -
(SELECT COUNT(1) FROM MTL_ITEMS WHERE ITEM_ID IN (17721, 17239)))
4)查询结果
- 数据大于10条
1)普通SQL查询
SELECT ORG_ID,ITEM_ID,UOM_CODE FROM MTL_ITEMS WHERE ITEM_ID BETWEEN 17721 AND 17750
2)查询结果
3)补充行SQL查询
SELECT ORG_ID || '', ITEM_ID || '', UOM_CODE
FROM MTL_ITEMS
WHERE ITEM_ID BETWEEN 17721 AND 17750
UNION ALL
SELECT '', '', ''
FROM DUAL
WHERE (CASE
WHEN (SELECT COUNT(1)
FROM MTL_ITEMS
WHERE ITEM_ID BETWEEN 17721 AND 17750) >= 10 THEN
2
ELSE
1
END) = 1
CONNECT BY LEVEL <
(10 - (SELECT COUNT(1)
FROM MTL_ITEMS
WHERE ITEM_ID BETWEEN 17721 AND 17750))
4)查询结果
可以看到,当查询数据不足十条时,该SQL可以补充空行,使结果显示十条;而当查询数据大于等于十条时,显示结果与普通SQL一致。
该sql如果在JAVA端进行拼接的话,可以先查询出普通sql语句能够返回的数据条数,然后再嵌入后面另个子查询中去,相对而言会比较直观,大概数据小于10行时,还可以减少一次sql查询。