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的答案获得我想要的结果。如果你有一些例子,请分享给我。