sql-server - SQL 连接和计数

标签 sql-server select join count

我在 MS SQL Server 中有两张表,一张是护理人员的表,另一张是患者的表。每个病人都被分配了一些护理人员

╔════════════════╦══════════════════╦════════════════════╦═════════════════╗
║ 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     ║
╚════════════════╩══════════════════╩════════════════════╩═════════════════╝ 

我希望从我的护理人员表中选择所有记录,然后计算该护理人员在患者表中担任一级、二级或三级护理人员的次数,包括那些未分配给任何人的护理人员。

例如;

╔═══════════════╦═══════════════════════╦═════════════════════════╦═══════════════════╗
║ 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 ║
╚═══════════════╩═══════════════════════╩═════════════════════════╩═══════════════════╝ 

感谢您的帮助!

最佳答案

您可以使用:

<强> SqlFiddleDemo

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]) 

关于sql-server - SQL 连接和计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32938024/

相关文章:

javascript - 如何使用 Select 导航到 URL?

SQL:在另一个表中按列 desc 排序

sql-server - 将系统数据库恢复到具有不同名称的 SQL Server 时会发生什么情况?

c# - 如何使用 FluentMigrator 将值更新为 null

php - &lt;textarea&gt;和MYSQL在php中显示数据

mysql - 从另一个表中选择具有备用有序字段的行

mysql - JOIN 3表查询

php - 连接和空值行未显示

c# - 如何更改 SQL 中存储过程的排序规则?

mysql - 如何跨多个数据库查询数据?