Asp.net Sql交叉表(查询)

Asp.net Sql交叉表(查询),asp.net,sql-server,sql-server-2008-r2,Asp.net,Sql Server,Sql Server 2008 R2,我的问题是: SELECT Department.Dept_Name, Patient.Patient_Type, COUNT(*) AS TotalPatients FROM Patient INNER JOIN Payment ON Patient.RegNo = Payment.RegNo INNER JOIN Department ON Payment.DeptID = Department.Dept_ID WHERE (C

我的问题是:

SELECT
    Department.Dept_Name, 
    Patient.Patient_Type,
    COUNT(*) AS TotalPatients
FROM Patient 
INNER JOIN Payment 
    ON Patient.RegNo = Payment.RegNo 
INNER JOIN Department 
    ON Payment.DeptID = Department.Dept_ID
WHERE        (CONVERT(varchar, Patient.RegDateTime, 112) = CONVERT(varchar, GETDATE()-30, 112))
GROUP BY  
    Department.Dept_Name,
    Patient.Patient_Type
此查询的结果是:

Dept_Name               |  Patient_Type  | TotalPatients
ACCIDENT & EMERGENCY    |   Entitled     |      5
MCH                     |   Entitled     |      4
ACCIDENT & EMERGENCY    |   General      |     410
BURN CARE CENTER        |   General      |      5
G-MEDICINE (CH)         |   General      |     20
G-SURGERY (CH)          |   General      |     12
MCH                     |   General      |     39
ACCIDENT & EMERGENCY    |   Staff        |     4
G-MEDICINE (CH)         |   Staff        |     1
BURN CARE CENTER        |   Referred     |     1
通缉结果:

Dept_Name               |  Entitled | General   | Staff | Referred |
ACCIDENT & EMERGENCY    |   5       |  410      | 4     | 0        |
MCH                     |   4       |  39       | 0     | 0        | 
BURN CARE CENTER        |   0       |   5       | 0     | 1        |
G-MEDICINE (CH)         |   0       |   20      | 1     | 0        | 
G-SURGERY (CH)          |   0       |   12      | 0     | 0        |
请帮我得到我想要的结果。
部门和类型可以增加或减少。

我使用您提供的样本数据测试了以下内容,并相应返回。基本上,对于要根据PatientType值有条件地将TotalPatients传递给总和聚合器的每一列

select
   Dept_Name
  ,sum(case when Patient_Type = 'Entitled' then TotalPatients ELSE 0 end) Entitled 
  ,sum(case when Patient_Type = 'General'  then TotalPatients ELSE 0 end) General   
  ,sum(case when Patient_Type = 'Staff'    then TotalPatients ELSE 0 end) Staff 
  ,sum(case when Patient_Type = 'Referred' then TotalPatients ELSE 0 end) Referred 
from @t
group by Dept_Name
在需要动态列的情况下

IF EXISTS (SELECT * 
       FROM   tempdb.dbo.sysobjects o 
       WHERE  o.xtype IN ( 'U' ) 
              AND o.id = Object_id(N'tempdb..#t')) 
  DROP TABLE #t; 

CREATE TABLE #t 
  ( 
  dept_name     NVARCHAR(255), 
 patient_type  NVARCHAR(255), 
 totalpatients INT 
  ) 

INSERT INTO #t 
        (dept_name, 
         patient_type, 
         totalpatients) 
Insert Into #T (Dept_Name, Patient_Type  , TotalPatients) 
SELECT department.dept_name,  
   patient.patient_type,  
   Count(*) AS TotalPatients  
FROM   patient  
   INNER JOIN payment  
           ON patient.regno = payment.regno  
   INNER JOIN department  
           ON payment.deptid = department.dept_id  
WHERE  ( CONVERT(VARCHAR, patient.regdatetime, 112) =  
            CONVERT(VARCHAR, Getdate() - 30, 112) )  
GROUP  BY department.dept_name,  
      patient.patient_type 

DECLARE @cols  AS NVARCHAR(max), 
    @query AS NVARCHAR(max) 

SELECT @cols = Stuff((SELECT DISTINCT ',' + Quotename(patient_type) 
                  FROM   #t 
                  GROUP  BY dept_name, 
                            patient_type 
                  ORDER  BY 1 
                  FOR xml path(''), type).value('.', 'NVARCHAR(MAX)'), 1, 1, 
           '') 

SET @query = N'SELECT Dept_Name, ' + @cols + N' 
         from               
         #T x             
         pivot              
           (                     
            SUM(TotalPatients)                 
            for Patient_Type in (' 
            + @cols + N')             
            ) p ' 

EXEC Sp_executesql @query; 

您可以使用pivot使其工作,这支持动态列

DECLARE @cols AS NVARCHAR(MAX),
@query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(Patient_Type) 
                    from  YourResultTable
                    group by Dept_Name, Patient_Type
                    order by 1
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = N'SELECT Dept_Name, ' + @cols + N' from 
             (
                YourResultTable
            ) x
            pivot 
            (
                max(TotalPatients)
                for Patient_Type in (' + @cols + N')
            ) p '

exec sp_executesql @query;

可能的解决办法。我的查询包含3个不同的表以获得结果。那么我该如何使用它呢。将脚本替换为可结果将生效,或者创建一个表变量选择Department.Dept\u Name,Patient.Patient\u Type,COUNT(*)AS TotalPatients FROM Patient Internal JOIN Payment ON Patient.RegNo=Payment.RegNo Internal JOIN Department ON Payment.DeptID=Department.Dept_ID其中(CONVERT(varchar,Patient.RegDateTime,112)=CONVERT(varchar,GETDATE()-30112))按Department.Dept_名称分组,上面的Patient.Patient_types是我的查询如何将其管理到您提供的脚本中。请为您的查询提供别名,如select*from(您的脚本),如果您认为这很复杂且难以读取,可以使用表变量,并将所有select结果插入此表变量Patient_Type可以大于4。第5个值是否会导致另一列?您是否正在寻找基于每种患者类型的自动旋转方式?是的。因为我不能知道所有的患者类型。好的,那么你需要使用枢轴方法。如果你不能理解@Tony Dong的答案,我可以举一个例子。我仍然无法通过使用@Tony Gog的答案获得我想要的结果。如果你有一些例子,请分享给我。