我有这个查询,我想创建一个数据透视表。我已经看过一些样品,但我不太了解。
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
答案 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