Eye*_*arp 1 join sql-server t-sql count
我在这里似乎有类似的问题,但似乎没有一个答案符合我正在寻找的-
假设我有一张这样的桌子:
分配给 | 部门ID | 类型 |
---|---|---|
玛丽 | 5001 | 初级 |
鲍勃 | 5002 | 中间 |
鲍勃 | 5003 | 初级 |
吉尔 | 5004 | 高的 |
鲍勃 | 5005 | 高的 |
鲍勃 | 5006 | 高的 |
另一个像这样:
用户 | 电话 | 地址 |
---|---|---|
玛丽 | 111-222-3333 | 南巷111号 |
鲍勃 | 222-111-3333 | 北大道222号 |
吉尔 | 333-222-1111 | 555公路 |
我想在第一个表上输出带有左连接的第二个表,其中包含每个指定用户的“类型”总数(基本、中、高),因此它需要类似的内容:
用户 | 电话 | 小学总计 | 总中 | 总高 |
---|---|---|---|---|
玛丽 | 111-222-3333 | 1 | 0 | 0 |
鲍勃 | 222-111-3333 | 1 | 1 | 2 |
吉尔 | 333-222-1111 | 0 | 0 | 1 |
我已经尝试过--Count(case when <table>.[type] = 'Elementary' then 1 else 0 end) AS ElementaryCount,
,但这只是让我获得整个表,而不是左连接的用户。
有人知道我该怎么做吗?
请遵循本问答中的建议:
特别是在创建表和插入语句时准备数据以将其暂存,以便于试图在空闲时间帮助您的人们轻松使用。
CREATE TABLE
#assignments
(
AssignedTo varchar(10),
DeptID integer,
[Type] varchar(10)
);
INSERT
#assignments
(
AssignedTo,
DeptID,
[Type]
)
SELECT
x.AssignedTo,
x.DeptID,
x.Type
FROM
(
VALUES
('Mary', 5001, 'Elementary'),
('Bob', 5002, 'Middle'),
('Bob', 5003, 'Elementary'),
('Jill', 5004, 'High'),
('Bob', 5005, 'High'),
('Bob', 5006, 'High')
) AS x (AssignedTo, DeptID, [Type]);
CREATE TABLE
#users
(
[User] varchar(10),
Telephone varchar(12),
Address varchar(20)
);
INSERT
#users
(
[User],
Telephone,
Address
)
SELECT
x.[User],
x.Telephone,
x.Address
FROM
(
VALUES
('Mary', '111-222-3333', '111 South Lane'),
('Bob', '222-111-3333', '222 North Drive'),
('Jill', '333-222-1111', '555 Highway')
) AS x ([User], Telephone, Address);
Run Code Online (Sandbox Code Playgroud)
现在为没有任何分配的用户添加行:
INSERT
#users
(
[User],
Telephone,
Address
)
SELECT
x.[User],
x.Telephone,
x.Address
FROM
(
VALUES
('E-Cores', '000-000-0000', '1 Slow Street'),
('P-Cores', '999-999-9999', '1 Fast Street')
) AS x ([User], Telephone, Address);
Run Code Online (Sandbox Code Playgroud)
这应该可以让你得到你想要的,使用SUM
而不是COUNT
.
SELECT
u.[User],
u.Telephone,
TotalElementary =
SUM
(
CASE
a.Type
WHEN 'Elementary'
THEN 1
ELSE 0
END
),
TotalMiddle =
SUM
(
CASE
a.Type
WHEN 'Middle'
THEN 1
ELSE 0
END
),
TotalHigh =
SUM
(
CASE
a.Type
WHEN 'High'
THEN 1
ELSE 0
END
)
FROM #users AS u
LEFT JOIN #assignments AS a
ON u.[User] = a.AssignedTo
GROUP BY
u.[User],
u.Telephone;
Run Code Online (Sandbox Code Playgroud)
+---------+--------------+-----------------+-------------+-----------+
| User | Telephone | TotalElementary | TotalMiddle | TotalHigh |
+---------+--------------+-----------------+-------------+-----------+
| E-Cores | 000-000-0000 | 0 | 0 | 0 |
| Mary | 111-222-3333 | 1 | 0 | 0 |
| Bob | 222-111-3333 | 1 | 1 | 2 |
| Jill | 333-222-1111 | 0 | 0 | 1 |
| P-Cores | 999-999-9999 | 0 | 0 | 0 |
+---------+--------------+-----------------+-------------+-----------+
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1205 次 |
最近记录: |