【问题标题】:Insight on creating a crosstab query in SQL Server在 SQL Server 中创建交叉表查询的见解
【发布时间】:2013-07-05 00:53:03
【问题描述】:

我在 Ms. Access 2007 中有一个交叉表查询,我想转换到 SQL Server 2008。我不熟悉 SQL 中的交叉表方法,请大家提供一些见解?

下面是我的 Ms.Access 代码。

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”作为值

非常感谢您的帮助

【问题讨论】:

  • 我以前从未听说过交叉表查询。也许这个类似的问题可以帮助你:stackoverflow.com/questions/16946836/…
  • 嗨,笨蛋,在 Access 女士中它是交叉表,但在 SQL 中,我相信相关术语是 Pivot。

标签: sql sql-server-2008 ms-access-2007 pivot crosstab


【解决方案1】:

为了将数据行转换为 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 的值,上面的版本会很好用,但是如果您不知道这些值,那么您将需要考虑使用动态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)

【讨论】:

  • 我整理了错误,这是因为我没有在日期和其他一些小东西周围加上括号 []。它现在工作正常。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2022-12-08
  • 2014-04-01
  • 2012-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-23
相关资源
最近更新 更多