我有一個包含 2 個表的資料庫:
- 包含訂單資料的suporder(PK:Id)
- 有一個名為訂單值的列
orderamt
- 有一個名為訂單值的列
- supexpiry保持到期資料(FK訂單ID的參考suporder.Id)
- 有一個名為到期值的列
expiryamt
- 有一個名為到期值的列
我有下面的查詢作業,但我堅持我有一個額外的要求。我需要檢索的COUNT和SUM supexpiry.expiryamt,其中supexpiry.expiryamt比相關的2%以上suporder.orderamt。
select distinct(s.merchantId::int), s.merchantName, count(s.id)::int as orderCount, sum(s.orderamt) as orderAmt, count(s2.orderid)::int as expiryCount, sum(s2.expiredamt) as expiryAmt
from suporder s
left join supexpiry s2 on s2.orderid = s.id
where s.orderdate >= '2021-09-01'::date and s.orderdate <= '2021-10-13'::date
group by s.merchantid, s.merchantname
因此,理想情況下,輸出將如下所示(最后 2 列是新列):
| 商人 | 商戶名稱 | 訂單數 | 訂單 | 過期計數 | 到期 | 到期時間>2%count | 到期>2%amt |
|---|---|---|---|---|---|---|---|
| 1234567890 | 馬克和斯賓塞 | 144737 | 2259026472 | 17650 | 20596768 | 13232 | 18344568 |
| 5345512331 | 亞馬遜 | 5123 | 27999459 | 873 | 14871 | 795 | 13555 |
非常感謝任何幫助,謝謝。
uj5u.com熱心網友回復:
更改count(s2.orderid)到sum(case when s2.expiredamt/s.orderamt > .02 then 1 else 0 end)
和sum(s2.expiredamt)到sum(case when s2.expiredamt/s.orderamt > .02 then s2.expiredamt else 0 end)
或者,如果你不喜歡重復,你可以cross join lateral (values (case when s2.expiredamt/s.orderamt > .02 then 1 else 0 end)) expired(multiplier)然后使用sum(expired.multiplier)和sum(expired.multiplier * s2.expiredamt)
uj5u.com熱心網友回復:
您遇到的問題似乎是您想在使用“group by”子句對資料進行分組后對其進行過濾。也就是說,在資料匯總之后。要進行您想要的那種過濾,您需要使用having關鍵字。Have 與 where 基本相同,只是它對聚合后的資料起作用。
所以你的查詢看起來像
select...
where...
group by...
having...
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/313920.html
標籤:sql PostgreSQL
