0

以下の私のクエリは、それが返す最後のレコードの量を2倍にしています。アクティビティ、予約、一時予約の3つのテーブルがあります。クエリは、アクティビティと添付情報を一覧表示し、各アクティビティによって予約テーブルから(BookingTotalとして)予約された場所の総数(SUMを使用)を取得する必要があります。次に、一時予約(tempPlacesReservedとして)についても同じように計算する必要があります。そのテーブル内のreservedateフィールドは将来です。

ただし、最初の問題は、tempbookingsテーブルにアクティビティのレコードがない場合、そのアクティビティのレコードがまったく返されないことです。これを回避するために、過去にダミーレコードを作成して、レコードを返すようにしましたが、私がそれをすることができるので、私がこれをする必要がないならば、私はそれを好むでしょう!

私が抱えている主な問題は、返された結果の最終的な記録では、予約の合計と予約された場所が2倍になり、もちろんクエリ全体が役に立たなくなることです。

私は何か間違ったことをしていることを知っています。私はそれを分類することができませんでした。オンラインで同様の問題を検索しましたが、それらを私の状況に正しく適用することができません。

どんな助けでもいただければ幸いです。

PS通常、データベース、テーブル、フィールドへのすべてのパスに完全にラベルを付ける必要はないことは承知していますが、使用する予定のプログラムでは、この方法でラベルを付ける必要があります。

コード:

SELECT [LeisureActivities].[dbo].[activities].[activityID], 
    [LeisureActivities].[dbo].[activities].[activityName], 
    [LeisureActivities].[dbo].[activities].[activityDate], 
    [LeisureActivities].[dbo].[activities].[activityPlaces], 
    [LeisureActivities].[dbo].[activities].[activityPrice], 
    SUM([LeisureActivities].[dbo].[bookings].[bookingPlaces]) AS 'bookingTotal', 
    SUM (CASE WHEN[LeisureActivities].[dbo].[tempbookings].[tempReserveDate] > GetDate() THEN [LeisureActivities].[dbo].[tempbookings].[tempPlaces] ELSE 0 end) AS 'tempPlacesReserved'
FROM [LeisureActivities].[dbo].[activities], 
    [LeisureActivities].[dbo].[bookings], 
    [LeisureActivities].[dbo].[tempbookings]
WHERE ([LeisureActivities].[dbo].[activities].[activityID]=[LeisureActivities].[dbo].[bookings].[activityID] 
    AND [LeisureActivities].[dbo].[activities].[activityID]=[LeisureActivities].[dbo].[tempbookings].[tempActivityID]) 
    AND [LeisureActivities].[dbo].[activities].[activityDate] > GetDate ()
GROUP BY [LeisureActivities].[dbo].[activities].[activityID], 
    [LeisureActivities].[dbo].[activities].[activityName], 
    [LeisureActivities].[dbo].[activities].[activityDate],
     [LeisureActivities].[dbo].[activities].[activityPlaces], 
    [LeisureActivities].[dbo].[activities].[activityPrice];
4

2 に答える 2

1

現在のクエリはINNER JOIN各テーブル間を使用しているため、tempBookingsテーブルにレコードがない場合は何も返されません。

JOIN構文を使い始めることをお勧めします。合計を取得するには、サブクエリを使用する必要がある場合もあります。

SELECT a.[activityID], 
    a.[activityName], 
    a.[activityDate], 
    a.[activityPlaces], 
    a.[activityPrice], 
    coalesce(b.bookingTotal, 0) bookingTotal, 
    coalesce(t.tempPlacesReserved, 0) tempPlacesReserved
FROM [LeisureActivities].[dbo].[activities] a
LEFT JOIN
(
  select activityID,
    SUM([bookingPlaces]) AS bookingTotal
  from [LeisureActivities].[dbo].[bookings]
  group by activityID
) b
  ON a.[activityID]=b.[activityID] 
LEFT JOIN
(
  select tempActivityID,
    SUM(CASE WHEN [tempReserveDate] > GetDate() THEN [tempPlaces] ELSE 0 end) AS tempPlacesReserved
  from [LeisureActivities].[dbo].[tempbookings]
  group by tempActivityID
) t
  ON a.[activityID]=t.[tempActivityID]
WHERE a.[activityDate] > GetDate();

注:読みやすいため、エイリアスを使用しています

于 2013-03-21T17:54:50.607 に答える
0

新しいSQL-92結合構文を使用し、tempBookingsへの結合を外部結合にします。また、テーブルエイリアスを使用してSQLをクリーンアップします。読みやすくなります。最後の行の値が2倍になった理由についてはわかりませんが、偶然にも、入力した余分なダミーレコードが原因である可能性があります。それらを取り除きます。この問題は、tempBookingsへの外部結合を使用することで修正されます。もう1つの可能性は、tempBookingsテーブル(t.tempActivityID = a.activityID)への結合条件が、アクティビティテーブルの1つのレコードのみに一致することを保証するには不十分であるということです...たとえば、2つに一致する場合アクティビティのレコードの場合、Tempbookingsの行が出力で2回繰り返されます(合計が2倍になります)

SELECT a.activityID, a.activityName, a.activityDate, 
       a.activityPlaces, a.activityPrice, 
       SUM(b.bookingPlaces) bookingTotal, 
       SUM (CASE WHEN t.tempReserveDate > GetDate() 
                 THEN t.tempPlaces ELSE 0 end) tempPlacesReserved
FROM LeisureActivities.dbo.activities a
    Join LeisureActivities.dbo.bookings b
       On b.activityID = a.activityID
    Left Join LeisureActivities.dbo.tempbookings t
       On t.tempActivityID = a.activityID
WHERE a.activityDate > GetDate ()
GROUP BY a.activityID, a.activityName, 
    a.activityDate, a.activityPlaces, 
    a.activityPrice;
于 2013-03-21T17:56:12.853 に答える