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
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)
谢谢。
尝试这个:
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)
如果您想在时间表表中包含条件,例如
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)