Tsql 查询以查找尚未付款的用户?
我有以下SQLTsql 查询以查找尚未付款的用户?,tsql,case,Tsql,Case,我有以下SQL SELECT CASE WHEN B.bookingId = P.bookingId THEN 1 ELSE 0 END AS PAID FROM Booking B LEFT OUTER JOIN Payment P ON P.bookingId = B.bookingId 输出3行;1、1和0 我想扩展此查询以输出0值的预订详细信息 我该怎么做 谢谢如果我理解你的问题,这将提供这
SELECT CASE
WHEN B.bookingId = P.bookingId
THEN 1
ELSE 0
END AS PAID
FROM Booking B
LEFT OUTER JOIN Payment P ON P.bookingId = B.bookingId
输出3行;1、1和0
我想扩展此查询以输出0值的预订详细信息
我该怎么做
谢谢如果我理解你的问题,这将提供这两方面的详细信息。然后你可以忽略1的细节
SELECT CASE
WHEN B.bookingId = P.bookingId
THEN 1
ELSE 0
END AS PAID,
B.details
FROM Booking B
LEFT OUTER JOIN Payment P ON P.bookingId = B.bookingId
也许还有别的办法
SELECT CASE
WHEN B.bookingId = P.bookingId
THEN 1
ELSE 0
END AS PAID,
WHEN B.bookingId = P.bookingId
THEN ''
ELSE B.details
END AS UNPAIDDETAILS,
FROM Booking B
LEFT OUTER JOIN Payment P ON P.bookingId = B.bookingId
如果您在SQL 2005中+
;with cte as (
SELECT B.BookingId,
CASE
WHEN B.bookingId = P.bookingId
THEN 1
ELSE 0
END AS PAID
FROM Booking B
LEFT OUTER JOIN Payment P ON P.bookingId = B.bookingId
)
select B.*
from Booking B
inner join cte
on B.BookingId = cte.BookingId
where cte.PAID = 0
由于Booking中的行将始终出现在结果集中,因为它是联接中的左侧表,因此您只需包含希望返回列列表的列:
SELECT CASE
B.Column1Name,
B.Column2Name,
WHEN B.bookingId = P.bookingId
THEN 1
ELSE 0
END AS PAID
FROM Booking B
LEFT OUTER JOIN Payment P ON P.bookingId = B.bookingId
这将显示所有记录的预订详细信息
如果您只对未付记录感兴趣,请在WHERE子句中添加一些内容,以将输出仅限于这些记录:
SELECT CASE
B.Column1Name,
B.Column2Name,
WHEN B.bookingId = P.bookingId
THEN 1
ELSE 0
END AS PAID
FROM Booking B
LEFT OUTER JOIN Payment P ON P.bookingId = B.bookingId
WHERE P.bookingID IS NOT NULL
如果您需要在paid==0时拥有一列,那么在paid==1时也将拥有该列 试试这个: select case when booking.bookingId = payment.bookingId then 1 else 0 end as paid, column_detail1, column_detail2 from booking left outter join payment on payment.bookingId = booking.bookingId 如果您只想在“已付款”为0时选择信息,您可以尝试以下操作: select paid_flag.paid, booking.detail1, booking.detail2 from ( select case when booking.bookingId = payment.bookingId then 1 else 0 end as paid, booking.bookingId from booking left outter join payment on payment.bookingId = booking.bookingId ) paid_flag join booking on paid_flag.bookingId = booking.bookingId where paid_flag.paid == 0
上面的查询似乎可以优化。我想我们可能需要一些示例数据,并查看您的模式。另外,您将如何处理部分付款?此外,您还没有确定要查找的数据。您想要什么样的结果?“预订详情”是什么?atm没有部分付款,数据库可以由预订和付款实体确定。记账实体具有bookingId,但付款实体仅具有由付款实体中的bookingId确定的已付款用户的行。自动取款机没有部分付款。我想他也想包括1。很难说。对不起,我应该说得更清楚些,我确实想要那些,但我可以很容易地根据查询确定其余的。兰迪:谢谢你,这是一个快速简单的查询,以得到我想要的+你的方法也行,但我更喜欢另一种方法 select case when booking.bookingId = payment.bookingId then 1 else 0 end as paid, column_detail1, column_detail2 from booking left outter join payment on payment.bookingId = booking.bookingId select paid_flag.paid, booking.detail1, booking.detail2 from ( select case when booking.bookingId = payment.bookingId then 1 else 0 end as paid, booking.bookingId from booking left outter join payment on payment.bookingId = booking.bookingId ) paid_flag join booking on paid_flag.bookingId = booking.bookingId where paid_flag.paid == 0