【问题标题】:SQL select with case when and join tableSQL select with case when and join table
【发布时间】:2021-06-14 08:05:17
【问题描述】:

我在 sql (postgresql) 中有 2 个表

tbl1:

dates roomid stok
2021-03-15 A01 3
2021-03-16 A01 3
2021-03-17 A01 3

tbl2:

bookingcode startdate enddate roomid
B001 2021-03-15 2021-03-17 A01

我的语法是这样的

select dates, tbl1.roomid,
case
    when dates between startdate and enddate - integer '1' then stok -1
else stok
end stok
from tbl1
join tbl2
on tbl1.roomid = tbl2.roomid  order by dates asc

当预订数量为一个(tbl2)时,它匹配这样的结果。结果是正确的

dates roomid stok
2021-03-15 A01 2
2021-03-16 A01 2
2021-03-17 A01 3

但是当booking是2的时候,是这样的(tbl2)

bookingcode startdate enddate roomid
B001 2021-03-15 2021-03-17 A01
B002 2021-03-15 2021-03-17 A01

结果是这样的,结果不合适

dates roomid stok
2021-03-15 A01 2
2021-03-15 A01 2
2021-03-16 A01 2
2021-03-16 A01 2
2021-03-17 A01 3
2021-03-17 A01 3

预订2时我想要的结果是这样的

dates roomid stok
2021-03-15 A01 1
2021-03-16 A01 1
2021-03-17 A01 3

谁能提出解决方案?

【问题讨论】:

  • 如果你不想要mysql的答案,不要用它来标记问题。
  • 好吧,先生,我更正了标签

标签: sql postgresql


【解决方案1】:

如果你需要更新数据库就这样做

UPDATE tbl1 SET stok = stok - (SELECT COUNT(*) FROM tbl2 WHERE tbl1.roomid = tbl2.roomid AND tbl1.dates >= tbl2.startdate AND tbl1.dates < tbl2.enddate);

不然

SELECT dates, roomid, stok - (SELECT COUNT(*) FROM tbl2 WHERE tbl1.roomid = tbl2.roomid AND tbl1.dates >= tbl2.startdate AND tbl1.dates < tbl2.enddate) FROM tbl1;

【讨论】:

  • 我知道这可能不是最好的解决方案,因为它需要 O(n²) 时间复杂度。
  • 大谢!!它的工作,谢谢你:D @graphemecluster
  • 我编辑了第二种方法,因为不需要连接表。
猜你喜欢
  • 1970-01-01
  • 2014-01-29
  • 2022-10-06
  • 1970-01-01
  • 1970-01-01
  • 2019-03-27
  • 1970-01-01
  • 2012-09-17
  • 2020-10-08
相关资源
最近更新 更多