为数据透视表创建查询

时间:2015-03-26 16:55:42

标签: sql sql-server tsql pivot-table

我有这个查询,我想创建一个数据透视表。我已经看过一些样品,但我不太了解。

SELECT        Users.FullName, Speciality.Shortname, COUNT(1) AS contador
FROM            DoctorsVisits INNER JOIN
                         Speciality ON DoctorsVisits.SpecialityId = Speciality.SpecialityId INNER JOIN
                         VisitType ON DoctorsVisits.VisitTypeId = VisitType.VisitTypeId INNER JOIN
                         Users ON DoctorsVisits.UserId = Users.UserId
WHERE        (MONTH(DoctorsVisits.VisitDate) = @month) AND (YEAR(DoctorsVisits.VisitDate) = @year)
GROUP BY Speciality.Shortname, Users.FullName

我的想法是将Speciality.Shortname放在列上,将行中的Users.FullName和Count(1)作为contador作为表内的交叉值。我正在使用VS 2010表适配器

我做了一个这样的

ACS和CIR是专业表

列短名称中的行
SELECT * FROM
( 
SELECT        Speciality.Shortname, Users.FullName, COUNT(1) AS contador
FROM            DoctorsVisits INNER JOIN
                         Speciality ON DoctorsVisits.SpecialityId = Speciality.SpecialityId INNER JOIN
                         VisitType ON DoctorsVisits.VisitTypeId = VisitType.VisitTypeId INNER JOIN
                         Users ON DoctorsVisits.UserId = Users.UserId
)  j
PIVOT 
(
SUM(contador) 
FOR Shortname 
IN 
(
[ACS],[CIR]
) 
) PivotTable

2 个答案:

答案 0 :(得分:0)

我能用您提供的信息做的最好的事情是指向一篇文章,该文章可以帮助您完成how to build a dynamic pivot query。为您提供更精确的答案需要有关您的数据和要求的更多信息。查看文章,我认为它做得很好。

编辑: 好的,这个示例代码应该引导您完成PIVOT的设置。请记住,这是一个静态的支点。如果您不想手动列出一百个不同的专业,那么您需要从此开始并构建动态支点。两者之间的唯一区别是,通过动态支点,您可以动态地放置动态"在变量中构建SQL查询,然后执行变量。

还有一件事......我的示例代码省略了VisitType表。我假设DoctorsVisits和VisitType之间存在外键约束。如果是这样,那么这个INNER JOIN对查询没有影响,只是减慢了一点。所以我把它留了出来。如果需要,您可以随意添加。

use tempdb
GO
SET NOCOUNT ON;

DECLARE @Users          TABLE(UserID int, FullName varchar(50));
DECLARE @Specialty      TABLE(SpecialtyID int, ShortName varchar(50));
DECLARE @DoctorsVisits  TABLE(UserID int, VisitTypeID int, SpecialtyID int, visitDate DateTime);
--DECLARE @VisitType        TABLE(VisitTypeID int); -- NOT USED

INSERT @Users VALUES (1, 'Jim Bob');
INSERT @Users VALUES (2, 'Bobbie Joe');
INSERT @Users VALUES (3, 'Bubba');
INSERT @Users VALUES (4, 'Mike');

INSERT @Specialty VALUES (1, 'Pediatrics');
INSERT @Specialty VALUES (2, 'Obstetrics');
INSERT @Specialty VALUES (3, 'Cardiology');
INSERT @Specialty VALUES (4, 'Immunology');

INSERT @DoctorsVisits VALUES (1, 0, 4, '1/1/2014');
INSERT @DoctorsVisits VALUES (1, 0, 4, '3/3/2014');
INSERT @DoctorsVisits VALUES (1, 0, 3, '12/12/2014');
INSERT @DoctorsVisits VALUES (2, 0, 1, '1/1/2014');
INSERT @DoctorsVisits VALUES (2, 0, 1, '4/4/2014');
INSERT @DoctorsVisits VALUES (2, 0, 1, '10/10/2014');
INSERT @DoctorsVisits VALUES (2, 0, 1, '1/11/2015');
INSERT @DoctorsVisits VALUES (2, 0, 2, '7/7/2014');
INSERT @DoctorsVisits VALUES (2, 0, 2, '8/8/2014');
INSERT @DoctorsVisits VALUES (2, 0, 2, '9/9/2014');
INSERT @DoctorsVisits VALUES (3, 0, 3, '1/11/2013');
INSERT @DoctorsVisits VALUES (3, 0, 3, '1/11/2014');
INSERT @DoctorsVisits VALUES (3, 0, 3, '1/11/2015');
INSERT @DoctorsVisits VALUES (4, 0, 3, '10/10/2014');

SET NOCOUNT OFF;

SELECT FullName, [Pediatrics], [Cardiology], [Obstetrics]
FROM ( 
    SELECT  S.Shortname, U.FullName, 1 as contador
    FROM    @DoctorsVisits D INNER JOIN
            @Specialty S ON D.SpecialtyID = S.SpecialtyID INNER JOIN
            @Users U ON D.UserId = U.UserId
)  SourceTable
PIVOT 
(
SUM(contador) 
FOR Shortname IN ([Pediatrics], [Cardiology], [Obstetrics]) 
) AS PivotTable

答案 1 :(得分:0)

我做到了..这个工作

SELECT        FullName as Name,[CIR],[CAR]
FROM            (SELECT        Users.FullName, Speciality.Shortname, COUNT(1) AS contar
                          FROM DoctorsVisits INNER JOIN
                          Users ON DoctorsVisits.UserId = Users.UserId INNER JOIN
                          Speciality ON DoctorsVisits.SpecialityId = Speciality.SpecialityId INNER JOIN
                          VisitType ON DoctorsVisits.VisitTypeId = VisitType.VisitTypeId 
                          WHERE (DoctorsVisits.EnterpriseId = 48) AND (Month(DoctorsVisits.VisitDate) = @mes) AND (Year(DoctorsVisits.VisitDate) = @ano) 
                          GROUP BY Users.FullName, Speciality.Shortname)as ps
                          PIVOT (COUNT(contar) FOR Shortname IN ([CIR], [CAR])) pvt