2016-12-14 40 views
1

我有2個表 預訂SQL怎麼算免費預訂

  • reservation no | trip ID |person ID| Status
  • 1 | 2 | 1 | C '
  • 2 | 3 | 2 | P'
  • 3 | 4 | 3 | P '
  • 4 | 1 | 4 | C'
  • 5 | 1 | 6 | P
  • 6 | 1 | 7 | P '
  • 7 | 2 | 5 | P'

其中P代表所許和C取消

和旅行

  • trip ID |trip Name|Date | Free Places
  • 1 | Paris |2016-12-18| 5
  • 2 | New York|2016-12-17| 6
  • 3 | Warsaw |2016-12-15| 5 '
  • 4 | London |2016-12-20| 10'

我想選擇無牽無掛位數每趟

  • trip ID |trip Name|Date | Free Places | Left free Spaces
  • 1 | Paris |2016-12-18 | 5 | 3
  • 2 | New York| 2016-12-17 | 6 | 5
  • 3 | Warsaw |2016-12-15 | 5 | 4
  • 4 | London |2016-12-20 | 10 | 9
+0

你使用哪種DBMS? – Jens

+0

你在哪裏找到你想要選擇的日期? – jarlh

+0

ms sql,我想得到最後一張表 – KrzK

回答

1

一種方法是將要使用的計算已經採取每次行程的空格數的預約表的子查詢。然後將其加回到trips表中以計算剩餘空間的數量。

SELECT t1.tripID, 
     t1.tripName, 
     t1.Date, 
     t1.FreePlaces, 
     t1.FreePlaces - COALESCE(t2.numBooked, 0) AS left_free_spaces 
FROM trips t1 
LEFT JOIN 
(
    SELECT tripID, SUM(CASE WHEN Status = 'P' THEN 1 ELSE 0 END) AS numBooked 
    FROM Reservations 
    GROUP BY tripID 
) t2 
    ON t1.tripID = t2.tripID 
+0

Tim Biegeleisen感謝您的幫助,它解決了我的問題。 – KrzK

0

試一下這個code.it可以幫助你

create table #RESERVATION (revservation_no bigint,trip_ID bigint,person_id bigint,status char(5)) 

insert into #RESERVATION values(1,2,1,'C'),(2,3,2,'P'),(3,4,3,'P'),(4,1,4,'C'),(5,1,6,'P'),(6,1,7,'P'),(7,2,5,'P') 

CREATE TABLE #TRIP (TRIP_ID BIGINT,TRIP_NAME VARCHAR(50),DATE_ DATE ,FREE_PLACES BIGINT) 

INSERT INTO #TRIP VALUES (1,'PARIS','2016-12-18',5),(2,'NEW YORK','2016-12-17',6),(3,'WARSAW','2016-12-15',5),(4,'LONDON','2016-12-20',10) 

;WITH CTE AS(
SELECT DISTINCT T.TRIP_ID,T.TRIP_NAME,T.DATE_,T.FREE_PLACES,COUNT(revservation_no)AS LEFT_SPACES FROM #TRIP T 
INNER JOIN #RESERVATION R ON R.trip_ID=T.TRIP_ID 
WHERE status='P' 
GROUP BY T.TRIP_ID,T.TRIP_NAME,T.DATE_,T.FREE_PLACES 
) 
SELECT TRIP_ID,TRIP_NAME,DATE_,FREE_PLACES,FREE_PLACES-LEFT_SPACES AS LEFT_FREE_PLACES FROM CTE 
0
Select  D1.trip_ID ,trip_Name, [Date] , D1.Free_Places, 
      D1.Free_Places - Sum(Case 
            When D2.Status = 'P' then 1 
            Else 0 
           End) as Left_free_Spaces 
From  Trips D1 
Inner Join Reservations D2 
    On  D1.trip_ID = D2.trip_ID 
Group by D1.trip_ID ,trip_Name, [Date] , Free_Places