[英]How can I use groupBy to create a map whose values are averages of BigDecimal fields?
[英]How can I create a View in Oracle with a column whose content depends on the combined values of pertaining entities?
在基於Oracle SQL數據庫的Java應用中,我有以下問題需要解決:
實體DataDelivery
可以包含任意數量的Packet
。 Packet
有一個PacketStatus
和外鍵datadeliveryid
。
PacketStatus
是一個枚舉值:
0, processed
1, processing
2, error
3, waiting
數值存儲在表 PACKET 的PacketStatus
列中。
在我看來,我想將DataDelivery
顯示為表行,其中包括一個列,該列顯示所有相關數據包的組合狀態。 Packets 的組合狀態應根據以下邏輯確定:
如果與 DataDelivery 相關的任何一個數據包的狀態為“錯誤”:查看列應顯示“錯誤”。
如果與 DataDelivery 相關的任何一個數據包具有“等待”狀態:查看列應顯示“等待”。
如果與 DataDelivery 相關的所有數據包都具有“已處理”狀態:查看列應顯示“已處理”。
如果與 DataDelivery 相關的所有數據包都處於“正在處理”狀態:查看列應顯示“正在處理”。
如果與 DataDelivery 相關的所有數據包都處於“已處理”或“正在處理”狀態:查看列應顯示“正在處理”。
在所有其他情況下,視圖列應顯示:'error'。
count
忽略null
s。 您可以使用此事實對case
表達式執行count
,以計算處於哪種狀態的數據包數量。 從那時起,這是將所有內容與case
s 粘合在一起的問題:
SELECT dd.*, status
FROM DataDelivery dd
JOIN (SELECT dataDeliveryId,
CASE WHEN COUNT(CASE status WHEN 2 THEN 1 END) > 0 THEN 'error'
WHEN COUNT(CASE status WHEN 3 THEN 1 END) > 0 THEN 'waiting'
WHEN COUNT(CASE status WHEN 0 THEN 1 END) = COUNT(*) THEN 'processed'
WHEN COUNT(CASE status WHEN 1 THEN 1 END) = COUNT(*) THEN 'processing'
ELSE 'error' END AS status
FROM packet
GROUP BY dataDeliveryId) p ON dd.dataDeliveryId = p.dataDeliveryId
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.