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/

相关文章:

sql-server - 如何在SQL Server中创建删除前触发器?

mysql 测验排行榜按分数、花费时间过滤

SQL查询以显示与同一张表的差异

mysql - 在返回不正确值的 SELECT 子句中使用 INNER JOIN

mysql - 我将如何使用 SQL 完成此操作?

c# - 使用 NHibernate 插入失败后 SQL 不可用

sql - 计算两个日期之间的营业时间

sql - 在 SQL SERVER 中对表进行分组

php - 将类添加到 ACF 多选

php - 简化php代码按列和排序结果从mysql数据库中选择数据