合并和格式化两个表中的数据

Jac*_*ack 4 sql-server-2008

我有一个表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)

但发现很难合并并获得我想要的第三张桌子。

Pau*_*ite 6

表创建和示例数据脚本:

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)