我有一个表Slot
,默认数据如下:
第一桌
================================
| Day | Time | Venue | Free |
================================
| 1 | 0830 | RM 1 | 10 |
| 1 | 0830 | RM 2 | 10 |
| 1 | 1030 | RM 1 | 20 |
| 1 | 1030 | RM 2 | 20 |
| 2 | 0830 | RM 1 | 10 |
| 2 | 0830 | RM 2 | 10 |
| 2 | 1030 | RM 1 | 30 |
| 2 | 1030 | RM 2 | 30 |
================================
Run Code Online (Sandbox Code Playgroud)
还有另一个表Booking
的数据可能随时来来去去,但列标题是固定的:
第二表
===================================
| Day | Time | Venue | User |
===================================
| 1 | 0830 | RM 1 | Jill |
| 1 | 0830 | RM 2 | Jill |
| 1 | 0830 | RM 1 | Jack |
| 1 | 0830 | RM 1 | Mary |
| 1 | 0830 | RM 2 | Mary |
| 1 | 0830 | RM 2 | Jill |
| 2 | 1030 | RM 1 | Ken |
| 2 | 1030 | RM 1 | Ken |
====================================
Run Code Online (Sandbox Code Playgroud)
根据表中的示例数据,Booking
我如何得出下表?
第三张桌子(这就是我想要的)
=======================================
| Day | Time | Venue | Free | Used |
=======================================
| 1 | 0830 | RM 1 | 10 | 3 |
| 1 | 0830 | RM 2 | 10 | 3 |
| 1 | 1030 | RM 1 | 20 | 0 |
| 1 | 1030 | RM 2 | 20 | 0 |
| 2 | 0830 | RM 1 | 10 | 0 |
| 2 | 0830 | RM 2 | 10 | 0 |
| 2 | 1030 | RM 1 | 30 | 2 |
| 2 | 1030 | RM 2 | 30 | 0 |
=======================================
Run Code Online (Sandbox Code Playgroud)
我能够检索下表
第四桌
================================
| Day | Time | Venue | Used |
================================
| 1 | 0830 | RM 1 | 3 |
| 1 | 0830 | RM 2 | 3 |
| 2 | 1030 | RM 1 | 2 |
================================
Run Code Online (Sandbox Code Playgroud)
通过使用以下命令
select
day, time, venue, COUNT(*) as Used
from
booking
group by
day, time, venue
order by
day asc, time asc, time asc
Run Code Online (Sandbox Code Playgroud)
但发现很难合并并获得我想要的第三张桌子。
表创建和示例数据脚本:
CREATE TABLE #Slot
(
[Day] tinyint NOT NULL,
[Time] time(0) NOT NULL,
Venue char(4) NOT NULL,
Free smallint NOT NULL CHECK (Free > 0),
PRIMARY KEY ([Day], [Time], Venue)
);
INSERT #Slot
([Day], [Time], Venue, Free)
VALUES
(1, '08:30', 'RM 1', 10),
(1, '08:30', 'RM 2', 10),
(1, '10:30', 'RM 1', 20),
(1, '10:30', 'RM 2', 20),
(2, '08:30', 'RM 1', 10),
(2, '08:30', 'RM 2', 10),
(2, '10:30', 'RM 1', 30),
(2, '10:30', 'RM 2', 10);
CREATE TABLE #Booking
(
[Day] tinyint NOT NULL,
[Time] time(0) NOT NULL,
Venue char(4) NOT NULL,
[User] varchar(10) NOT NULL
);
INSERT #Booking
([Day], [Time], Venue, [User])
VALUES
(1, '08:30', 'RM 1', 'Jill'),
(1, '08:30', 'RM 2', 'Jill'),
(1, '08:30', 'RM 1', 'Jack'),
(1, '08:30', 'RM 1', 'Mary'),
(1, '08:30', 'RM 2', 'Mary'),
(1, '08:30', 'RM 2', 'Jill'),
(2, '10:30', 'RM 1', 'Ken'),
(2, '10:30', 'RM 1', 'Ken');
Run Code Online (Sandbox Code Playgroud)
询问:
SELECT
s.[Day],
s.[Time],
s.Venue,
s.Free,
Used =
(
SELECT COUNT_BIG(*)
FROM #Booking AS b
WHERE
b.[Day] = s.[Day]
AND b.[Time] = s.[Time]
AND b.Venue = s.Venue
)
FROM #Slot AS s
ORDER BY
s.[Day],
s.[Time],
s.Venue;
Run Code Online (Sandbox Code Playgroud)
输出:
????????????????????????????????????????
? Day ? Time ? Venue ? Free ? Used ?
????????????????????????????????????????
? 1 ? 08:30:00 ? RM 1 ? 10 ? 3 ?
? 1 ? 08:30:00 ? RM 2 ? 10 ? 3 ?
? 1 ? 10:30:00 ? RM 1 ? 20 ? 0 ?
? 1 ? 10:30:00 ? RM 2 ? 20 ? 0 ?
? 2 ? 08:30:00 ? RM 1 ? 10 ? 0 ?
? 2 ? 08:30:00 ? RM 2 ? 10 ? 0 ?
? 2 ? 10:30:00 ? RM 1 ? 30 ? 2 ?
? 2 ? 10:30:00 ? RM 2 ? 10 ? 0 ?
????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
121 次 |
最近记录: |