在用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查詢。