Tsql 查询以查找尚未付款的用户?

Tsql 查询以查找尚未付款的用户?,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值的预订详细信息 我该怎么做 谢谢如果我理解你的问题,这将提供这

我有以下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值的预订详细信息

我该怎么做


谢谢

如果我理解你的问题,这将提供这两方面的详细信息。然后你可以忽略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