[英]Insight on creating a crosstab query in SQL Server
我想在Access 2007中使用一个交叉表查询,我想转换到SQL Server2008。我对SQL中的交叉表方法不熟悉,请您提供一些见解?
以下是我的女士门禁密码。
TRANSFORM IIf(Count([Admit_ID]) Is Null,0,Count([Admit_ID])) AS Expr1
SELECT [Admits].[PatientNumber] & '-' & [Admits].[PlanCode] AS Code]
FROM Admits
WHERE (((Admits.Admitdate)>="200701") AND ((Admits.Rate)="a"))
GROUP BY [Admits.[ PatientNumber] & '-' & [Admits].[ PlanCode]
ORDER BY [Admits].[ PatientNumber] & '-' & [Admits].[ PlanCode]
PIVOT Admits. Admitdate;
结果应以“代码”作为行,以“ Admit_date”作为列,以“ Admit_ID”作为值
非常感谢您的帮助
为了将数据行转换为SQL Server中的列,您将应用PIVOT函数。
基本语法如下:
select *
from
(
select a.admit_id,
code = a.patientnumber + '-'+ a.plancode,
admitdate
from admits a
where a.admitdate >= '200701'
and a.rate = 'a'
) d
pivot
(
count(admit_id)
for Admitdate in (place your dates here)
) piv;
如果您提前知道admitdate
的值,那么上面的版本将非常admitdate
,但是如果您不知道这些值,则需要使用动态SQL生成结果。 动态版本的代码将类似于以下内容:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME(admitdate)
from admits
where admitdate >= '200701'
group by admitdate
order by admitdate
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT code, ' + @cols + '
from
(
select a.admit_id,
code = a.patientnumber + ''-''+ a.plancode,
admitdate
from admits a
where a.admitdate >= ''200701''
and a.rate = ''a''
) x
pivot
(
count(admit_id)
for admitdate in (' + @cols + ')
) p '
execute(@query)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.