SQL 加入并计数
SQL Join & Count
我有两个 table,一个是护理人员,另一个是 MS SQL 服务器中的患者。每个病人都分配了一些护理人员
╔════════════════╦══════════════════╦════════════════════╦═════════════════╗
║ Patient Name ║ Primary Carer ║ Secondary Carer ║ Tertiary Carer ║
╠════════════════╬══════════════════╬════════════════════╬═════════════════╣
║ Joe Bloggs ║ John Smith ║ Oscar Wild ║ Tom Cruise ║
║ Mary Sue ║ John Smith ║ Matt Smith ║ Peter Pan ║
║ Peter Parker ║ John Smith ║ Oscar Wild ║ Matt Smith ║
╚════════════════╩══════════════════╩════════════════════╩═════════════════╝
我正在查看 select 我的护理人员 table 的所有记录,然后计算该护理人员在患者 table 中作为主要、二级或三级护理人员的次数包括那些没有被分配给任何人的照顾者。
例如;
╔═══════════════╦═══════════════════════╦═════════════════════════╦═══════════════════╗
║ Carer ║ Primary Carer Freq ║ Secondary Carer Freq ║ Third Carer Freq ║
╠═══════════════╬═══════════════════════╬═════════════════════════╬═══════════════════╣
║ John Smith ║ 3 ║ 0 ║ 0 ║
║ Oscar Wilde ║ 0 ║ 2 ║ 0 ║
║ Tom Cruise ║ 0 ║ 0 ║ 1 ║
║ Matt Smith ║ 0 ║ 1 ║ 0 ║
║ Peter Pan ║ 0 ║ 0 ║ 1 ║
║ Barry White ║ 0 ║ 0 ║ 0 ║
╚═══════════════╩═══════════════════════╩═════════════════════════╩═══════════════════╝
感谢您的帮助!
您可以使用:
SELECT
[name]
,[Primary Carer Freq] = COUNT(p1.[Primary Carer])
,[Secondary Carer Freq] = COUNT(p2.[Secondary Carer])
,[Third Carer Freq] = COUNT(p3.[Tertiary Carer])
FROM carers c
LEFT JOIN patients p1
ON p1.[Primary Carer] = c.[Name]
LEFT JOIN patients p2
ON p2.[Secondary Carer] = c.[Name]
LEFT JOIN patients p3
ON p3.[Tertiary Carer] = c.[Name]
GROUP BY [name];
数据:
CREATE TABLE patients([Patient Name] VARCHAR(100),
[Primary Carer] VARCHAR(100),
[Secondary Carer] VARCHAR(100),
[Tertiary Carer] VARCHAR(100) );
INSERT INTO patients
SELECT 'Joe Bloggs', 'John Smith', 'Oscar Wild', 'Tom Cruise'
UNION ALL SELECT 'Mary Sue', 'John Smith', 'Matt Smith', 'Peter Pan'
UNION ALL SELECT ' Peter Parker', 'John Smith', 'Oscar Wild', 'Matt Smith';
CREATE TABLE carers(Name VARCHAR(100));
INSERT INTO carers(Name)
SELECT 'John Smith'
UNION ALL SELECT 'Oscar Wilde'
UNION ALL SELECT 'Tom Cruise'
UNION ALL SELECT 'Matt Smith'
UNION ALL SELECT 'Peter Pan'
UNION ALL SELECT 'Barry White';
编辑:
如果你想要组合结果使用+
:
SELECT
[name]
,[Primary&Secondary Carer Freq] = COUNT(p1.[Primary Carer]) + COUNT(p2.[Secondary Carer])
,[Third Carer Freq] = COUNT(p3.[Tertiary Carer])
MS SQL Server 2008 架构设置:
CREATE TABLE Test_Table(PatientName VARCHAR(20), PrimaryCarer VARCHAR(20),
SecondaryCarer VARCHAR(20),TertiaryCarer VARCHAR(20));
INSERT INTO Test_Table VALUES
('Joe Bloggs' , 'John Smith' , 'Oscar Wild' , 'Tom Cruise'),
('Mary Sue' , 'John Smith' , 'Matt Smith' , 'Peter Pan' ),
('Peter Parker' , 'John Smith' , 'Oscar Wild' , 'Matt Smith');
查询 1:
SELECT CarerName
,COUNT(CASE WHEN CarerType = 'PrimaryCarer' THEN 1 END) AS PrimaryCarer
,COUNT(CASE WHEN CarerType = 'SecondaryCarer' THEN 1 END) AS SecondaryCarer
,COUNT(CASE WHEN CarerType = 'TertiaryCarer' THEN 1 END) AS TertiaryCarer
FROM Test_Table T
UNPIVOT (CarerName FOR CarerType IN(PrimaryCarer,SecondaryCarer,TertiaryCarer)
)up
GROUP BY CarerName
| CarerName | PrimaryCarer | SecondaryCarer | TertiaryCarer |
|------------|--------------|----------------|---------------|
| John Smith | 3 | 0 | 0 |
| Matt Smith | 0 | 1 | 1 |
| Oscar Wild | 0 | 2 | 0 |
| Peter Pan | 0 | 0 | 1 |
| Tom Cruise | 0 | 0 | 1 |
我有两个 table,一个是护理人员,另一个是 MS SQL 服务器中的患者。每个病人都分配了一些护理人员
╔════════════════╦══════════════════╦════════════════════╦═════════════════╗
║ Patient Name ║ Primary Carer ║ Secondary Carer ║ Tertiary Carer ║
╠════════════════╬══════════════════╬════════════════════╬═════════════════╣
║ Joe Bloggs ║ John Smith ║ Oscar Wild ║ Tom Cruise ║
║ Mary Sue ║ John Smith ║ Matt Smith ║ Peter Pan ║
║ Peter Parker ║ John Smith ║ Oscar Wild ║ Matt Smith ║
╚════════════════╩══════════════════╩════════════════════╩═════════════════╝
我正在查看 select 我的护理人员 table 的所有记录,然后计算该护理人员在患者 table 中作为主要、二级或三级护理人员的次数包括那些没有被分配给任何人的照顾者。
例如;
╔═══════════════╦═══════════════════════╦═════════════════════════╦═══════════════════╗
║ Carer ║ Primary Carer Freq ║ Secondary Carer Freq ║ Third Carer Freq ║
╠═══════════════╬═══════════════════════╬═════════════════════════╬═══════════════════╣
║ John Smith ║ 3 ║ 0 ║ 0 ║
║ Oscar Wilde ║ 0 ║ 2 ║ 0 ║
║ Tom Cruise ║ 0 ║ 0 ║ 1 ║
║ Matt Smith ║ 0 ║ 1 ║ 0 ║
║ Peter Pan ║ 0 ║ 0 ║ 1 ║
║ Barry White ║ 0 ║ 0 ║ 0 ║
╚═══════════════╩═══════════════════════╩═════════════════════════╩═══════════════════╝
感谢您的帮助!
您可以使用:
SELECT
[name]
,[Primary Carer Freq] = COUNT(p1.[Primary Carer])
,[Secondary Carer Freq] = COUNT(p2.[Secondary Carer])
,[Third Carer Freq] = COUNT(p3.[Tertiary Carer])
FROM carers c
LEFT JOIN patients p1
ON p1.[Primary Carer] = c.[Name]
LEFT JOIN patients p2
ON p2.[Secondary Carer] = c.[Name]
LEFT JOIN patients p3
ON p3.[Tertiary Carer] = c.[Name]
GROUP BY [name];
数据:
CREATE TABLE patients([Patient Name] VARCHAR(100),
[Primary Carer] VARCHAR(100),
[Secondary Carer] VARCHAR(100),
[Tertiary Carer] VARCHAR(100) );
INSERT INTO patients
SELECT 'Joe Bloggs', 'John Smith', 'Oscar Wild', 'Tom Cruise'
UNION ALL SELECT 'Mary Sue', 'John Smith', 'Matt Smith', 'Peter Pan'
UNION ALL SELECT ' Peter Parker', 'John Smith', 'Oscar Wild', 'Matt Smith';
CREATE TABLE carers(Name VARCHAR(100));
INSERT INTO carers(Name)
SELECT 'John Smith'
UNION ALL SELECT 'Oscar Wilde'
UNION ALL SELECT 'Tom Cruise'
UNION ALL SELECT 'Matt Smith'
UNION ALL SELECT 'Peter Pan'
UNION ALL SELECT 'Barry White';
编辑:
如果你想要组合结果使用+
:
SELECT
[name]
,[Primary&Secondary Carer Freq] = COUNT(p1.[Primary Carer]) + COUNT(p2.[Secondary Carer])
,[Third Carer Freq] = COUNT(p3.[Tertiary Carer])
MS SQL Server 2008 架构设置:
CREATE TABLE Test_Table(PatientName VARCHAR(20), PrimaryCarer VARCHAR(20),
SecondaryCarer VARCHAR(20),TertiaryCarer VARCHAR(20));
INSERT INTO Test_Table VALUES
('Joe Bloggs' , 'John Smith' , 'Oscar Wild' , 'Tom Cruise'),
('Mary Sue' , 'John Smith' , 'Matt Smith' , 'Peter Pan' ),
('Peter Parker' , 'John Smith' , 'Oscar Wild' , 'Matt Smith');
查询 1:
SELECT CarerName
,COUNT(CASE WHEN CarerType = 'PrimaryCarer' THEN 1 END) AS PrimaryCarer
,COUNT(CASE WHEN CarerType = 'SecondaryCarer' THEN 1 END) AS SecondaryCarer
,COUNT(CASE WHEN CarerType = 'TertiaryCarer' THEN 1 END) AS TertiaryCarer
FROM Test_Table T
UNPIVOT (CarerName FOR CarerType IN(PrimaryCarer,SecondaryCarer,TertiaryCarer)
)up
GROUP BY CarerName
| CarerName | PrimaryCarer | SecondaryCarer | TertiaryCarer |
|------------|--------------|----------------|---------------|
| John Smith | 3 | 0 | 0 |
| Matt Smith | 0 | 1 | 1 |
| Oscar Wild | 0 | 2 | 0 |
| Peter Pan | 0 | 0 | 1 |
| Tom Cruise | 0 | 0 | 1 |