繁体   English   中英

在SQL Server中创建交叉表查询的见解

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM