与 Group By 的完全外部联接

Khr*_*rys 1 sql group-by sql-server-2008-r2

[更新]:我已经用WHERE条款更新了问题。

我有以下 SQL 小提琴。结果是:

|   User |          Name |   Time |
|--------|---------------|--------|
|  00001 |     Mary Jane |     12 |
|  00002 |   Joana Smith |      7 |
|  00003 |  George Andrz |      2 |
|  00004 | Julia Roberts |      4 |
Run Code Online (Sandbox Code Playgroud)

我期待这个:

|   User |          Name |   Time |
|--------|---------------|--------|
|  00001 |     Mary Jane |     12 |
|  00002 |   Joana Smith |      7 |
|  00003 |  George Andrz |      2 |
|  00004 | Julia Roberts |      4 |
|  90000 | Anderson Math |      0 |
|  90001 |      Josh Xin |      0 |
Run Code Online (Sandbox Code Playgroud)

区别在于:MainUsers 表中有一些用户还没有做TimeSheet,所以TimeSheet 表对于这个人来说是空的。但我想显示名称,时间 = 0


SQL小提琴

MS SQL Server 2008 架构设置

CREATE TABLE MainUsers
(
  id int identity primary key, 
  UserID varchar(5), 
  FullName varchar(500),
);

INSERT INTO MainUsers
(UserID, FullName)
VALUES
('00001', 'Mary Jane'),
('00002', 'Joana Smith'),
('00003', 'George Andrz'),
('00004', 'Julia Roberts'),
('90000', 'Anderson Math'),
('90001', 'Josh Xin');

CREATE TABLE TimeSheet 
(
  id int identity primary key, 
  UserID varchar(5), 
  FullName varchar(500),
  Minutes int,
  TimeStamp Datetime,
);

INSERT INTO TimeSheet
(UserID, FullName, Minutes, TimeStamp)
VALUES
('00001', 'Mary Jane', 240, '2015-09-16 08:16:00'),
('00001', 'Mary Jane', 480, '2015-09-16 08:16:00'),
('00002', 'Joana Smith', 320, '2015-09-16 08:16:00'),
('00002', 'Joana Smith', 120, '2015-09-16 08:16:00'),
('00003', 'George Andrz', 120, '2015-09-16 08:16:00'),
('00004', 'Julia Roberts', 240, '2015-09-16 08:16:00');
Run Code Online (Sandbox Code Playgroud)

查询 1

SELECT u.UserID AS [User], u.FullName AS Name,
       SUM(t.Minutes) / 60 AS [Time]
FROM MainUsers u LEFT JOIN
     TimeSheet t
     ON u.UserID = t.UserID
WHERE
    month(TimeStamp) = 9 and year(TimeStamp) = 2015
GROUP BY u.UserID, u.FullName
ORDER BY u.UserID ASC
Run Code Online (Sandbox Code Playgroud)

结果

|  User |          Name | Time |
|-------|---------------|------|
| 00001 |     Mary Jane |   12 |
| 00002 |   Joana Smith |    7 |
| 00003 |  George Andrz |    2 |
| 00004 | Julia Roberts |    4 |
Run Code Online (Sandbox Code Playgroud)

谢谢。

Bet*_*eth 5

尝试这个:

SELECT
    u.UserID AS 'User',
    u.FullName AS Name,
    isnull(SUM(Minutes) / 60,0) AS [Time]
FROM
    MainUsers u left OUTER JOIN 
    TimeSheet t  ON 
    u.UserID = t.UserID
GROUP BY
    u.UserID,
    u.FullName
ORDER BY
    u.UserID
Run Code Online (Sandbox Code Playgroud)

SQL小提琴

如果您想在时间表表中包含条件,例如 month(timestamp) = 9 and year(timestamp) = 2015 并且您在WHERE子句中执行它,它会将您转换outer join为 an,inner join因为该WHERE子句需要时间戳表中的字段。要按left outer joined 表的月份和年份进行限制,请将条件放在JOIN子句中而不是 中WHERE,例如:

SELECT
    u.UserID AS 'User',
    u.FullName AS Name,
    isnull(SUM(Minutes) / 60,0) AS [Time]
FROM
    MainUsers u left OUTER JOIN 
    TimeSheet t  ON 
    u.UserID = t.UserID and
    month(timestamp) = 9 and year(timestamp) = 2015
GROUP BY
    u.UserID,
    u.FullName
ORDER BY
    u.UserID
Run Code Online (Sandbox Code Playgroud)

sql 小提琴