T-SQL查询帮助Pt。 II

时间:2011-04-09 21:22:31

标签: tsql

我需要帮助的最后一个查询是针对特定预订显示客人必须支付的暂定费用。

现在这有点复杂,因为有两个成本,一个是他们逗留期间的费用,另一个是另一张发票,他们从另一张发票(这是用于期间用餐等)他们的住宿)。

来宾预订表包含以下包含数据的列:

(confirm_no, agent_id, g_name, g_phone)

预订表包含以下带有数据的列:

(confirm_no, credit_card_no, res_checkin_date, res_checkout_date, 
 default_villa_type, price_plan)

发票表包含以下带有数据的列:

(inv_no, inv_date, inv_amount, confirm_no).

价格计划表包含以下带有数据的列:

(price_plan, rate, default_villa_type, bed_type)

因此,我需要以某种方式列出客人姓名及其总金额,分别来自预订表,价格表和发票表中的((res_checkout_date-res_checkin_date) * rate) + inv_amount(以及客人预订表中的客人姓名,即通过confirm_no链接。

看起来很复杂,我甚至不确定从哪里开始?

编辑:

来宾预订表如下:

http://img535.imageshack.us/i/guestreservation.jpg/

预订表如下:

http://img857.imageshack.us/i/reservation.jpg/

发票表目前没有任何内容。

价格计划表如下:

我不能发布超过链接,但它与上面的名称“priceplan.jpg”相同

3 个答案:

答案 0 :(得分:1)

您需要在四个表上进行INNER JOIN并进行计算:

像这样(未经测试):

select 
  GuestReservationTable.g_name, ((ReservationTable.res_checkout_date-ReservationTable.res_checkin_date) * PricePlanTable.rate) + InvoiceTable.inv_amount
from
  GuestReservationTable
  inner join ReservationTable on GuestReservationTable.confirm_no = ReservationTable.confirm_no
  inner join InvoiceTable on InvoiceTable .confirm_no = ReservationTable.confirm_no
  inner join PricePlanTable on PricePlanTable.price_plan = ReservationTable.PricePlan

答案 1 :(得分:1)

这样的事情可能会让你朝着正确的方向前进

select
  g.g_name, 
  datediff(d, r.res_checkin_date, r.res_checkout_date)*p.rate+coalesce(i.inv_amount, 0) as Amount
from reservation as r  
  inner join priceplan as p
    on r.price_plan = p.price_plan
  inner join guest_reservation as g
    on r.confirm_no = g.confirm_no
  left outer join invoice as i
    on r.confirm_no = i.confirm_no  

答案 2 :(得分:1)

您可以使用DATEDIFF计算天数,然后使用连接从每个表中获取值。发票表可能没有guest虚拟机的相关行,因此它需要是外部联接。外连接意味着inv_amount可以为null,因此您需要使用ISNULL检查它。

SELECT gr.guest_name, (DATEDIFF(d, r.res_checkout_date, r.res_checkin_date) * pp.rate ) + ISNULL(i.inv_amount, 0)
FROM guest_reservation gr LEFT OUTER JOIN invoice i ON gr.confirm_no = i.confirm_no
JOIN reservation r ON gr.confirm_no = r.confirm_no
JOIN price_plan pp ON r.price_plan = pp.price_plan

ISNULL在msdn http://msdn.microsoft.com/en-us/library/ms184325.aspx msdn http://msdn.microsoft.com/en-us/library/ms189794.aspx

的DateDiff帮助