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

感谢您的帮助!

您可以使用:

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 Fiddle

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

Results:

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