SELECT 来自相同 table 的相同数据,只是条件与不同的列不同
SELECT same data from same table just with conditions as different columns
我认为最好先向您展示他的查询:
SELECT
Positive.Amount AS PosAmount,
Negative.Amount AS NegAmount,
booking.Correction
FROM (booking)
LEFT JOIN ( SELECT ID, Amount FROM booking WHERE Amount < 0 )
AS Negative ON booking.ID = Negative.ID
LEFT JOIN ( SELECT ID, Amount FROM booking WHERE Amount > 0 )
AS Positive ON booking.ID = Positive.ID
我想在这里实现的是以下内容。我想要每次预订的金额,具体取决于它在不同列中是正数还是负数。这有可能以另一种更便宜的方式实现吗?我的意思是加入 table 本身不是最好的方法,对吗?
table 看起来像:
而想要的结果是这样的:
提前致谢!
你只需要在这里使用 CASE
语句。不需要子查询和自连接:
SELECT
CASE WHEN amount > 0 THEN amount END as posAmount,
CASE WHEN amount < 0 THEN amount END as negAmount,
correction
FROM booking
我不太确定你想要什么。也许是聚合:
SELECT SUM(CASE WHEN Amount > 0 THEN b.Amount ELSE 0 END) as PosAmount,
SUM(CASE WHEN Amount < 0 THEN b.Amount ELSE 0 END) as NegAmount,
b.Correction
FROM booking b
GROUP BY b.correction;
也许只是两个不同的列:
SELECT (CASE WHEN Amount > 0 THEN b.Amount ELSE 0 END) as PosAmount,
(CASE WHEN Amount < 0 THEN b.Amount ELSE 0 END) as NegAmount,
b.Correction
FROM booking b;
我认为最好先向您展示他的查询:
SELECT
Positive.Amount AS PosAmount,
Negative.Amount AS NegAmount,
booking.Correction
FROM (booking)
LEFT JOIN ( SELECT ID, Amount FROM booking WHERE Amount < 0 )
AS Negative ON booking.ID = Negative.ID
LEFT JOIN ( SELECT ID, Amount FROM booking WHERE Amount > 0 )
AS Positive ON booking.ID = Positive.ID
我想在这里实现的是以下内容。我想要每次预订的金额,具体取决于它在不同列中是正数还是负数。这有可能以另一种更便宜的方式实现吗?我的意思是加入 table 本身不是最好的方法,对吗?
table 看起来像:
而想要的结果是这样的:
提前致谢!
你只需要在这里使用 CASE
语句。不需要子查询和自连接:
SELECT
CASE WHEN amount > 0 THEN amount END as posAmount,
CASE WHEN amount < 0 THEN amount END as negAmount,
correction
FROM booking
我不太确定你想要什么。也许是聚合:
SELECT SUM(CASE WHEN Amount > 0 THEN b.Amount ELSE 0 END) as PosAmount,
SUM(CASE WHEN Amount < 0 THEN b.Amount ELSE 0 END) as NegAmount,
b.Correction
FROM booking b
GROUP BY b.correction;
也许只是两个不同的列:
SELECT (CASE WHEN Amount > 0 THEN b.Amount ELSE 0 END) as PosAmount,
(CASE WHEN Amount < 0 THEN b.Amount ELSE 0 END) as NegAmount,
b.Correction
FROM booking b;