【发布时间】:2014-09-13 06:36:27
【问题描述】:
我有一个如下所示的表格:
CREATE TABLE testrf
(
cola INTEGER,
colb VARCHAR(10)
)
插入一些数据:
INSERT INTO testrf VALUES(1,'x')
INSERT INTO testrf VALUES(1,'x')
INSERT INTO testrf VALUES(2,'x')
INSERT INTO testrf VALUES(3,'y')
INSERT INTO testrf VALUES(4,'y')
INSERT INTO testrf VALUES(5,'c')
INSERT INTO testrf VALUES(6,'c')
INSERT INTO testrf VALUES(7,'c')
INSERT INTO testrf VALUES(8,'d')
INSERT INTO testrf VALUES(3,'y')
INSERT INTO testrf VALUES(12,'M1')
INSERT INTO testrf VALUES(13,'L1')
INSERT INTO testrf VALUES(14,'C2')
INSERT INTO testrf VALUES(1,'c')
INSERT INTO testrf VALUES(1,'d')
INSERT INTO testrf VALUES(1,'L1')
SELECT * FROM testrf;
cola colb
------------
1 x
1 x
2 x
3 y
4 y
5 c
6 c
7 c
8 d
3 y
1 c
1 d
12 M1
13 L1
14 C2
1 L1
现在我想显示我已为其编写查询的上述数据的数据透视表:
DECLARE @cols NVARCHAR(MAX)
DECLARE @SQL NVARCHAR(MAX)
SELECT @cols = STUFF ( (SELECT DISTINCT '],[' + v.colb
FROM testrf AS v
FOR XML PATH('')), 1, 2, '') + ']'
SET @SQL = N'SELECT cola,TotalGroups,AvailableIn,'+ @cols +'
FROM
(SELECT v.cola,v.colb,(select count(distinct colb) from testrf) TotalGroups,c.AvailableIn
FROM testrf AS v
inner join
(select cola,count(case when colb>=1 then 1 else 0 end) AS AvailableIn FROM testrf
group by cola) c
on c.cola = v.cola
) p
PIVOT
(
count(colb)
FOR colb IN ( '+ @cols + ' )
) AS pvt';
EXEC(@SQL)
我会得到这个:
cola TotalGroups AvailableIn c C2 d L1 M1 x y
----------------------------------------------------------
1 7 5 1 0 1 1 0 2 0
2 7 1 0 0 0 0 0 1 0
3 7 2 0 0 0 0 0 0 2
4 7 1 0 0 0 0 0 0 1
5 7 1 1 0 0 0 0 0 0
6 7 1 1 0 0 0 0 0 0
7 7 1 1 0 0 0 0 0 0
8 7 1 0 0 1 0 0 0 0
12 7 1 0 0 0 0 1 0 0
13 7 1 0 0 0 1 0 0 0
14 7 1 0 1 0 0 0 0 0
注意:请注意row number 1 and 3。在AvailableIn 中,第一行的列值为 5,其中列的可用值仅为 4,即 c,d,L1,x 其余均为零。还有第 3 行,其中AvailableIn 为 2,其中列的可用值仅为 1,即y。我认为我被困在pivot query 中的aggregate function 中。
SQL 小提琴-> http://sqlfiddle.com/#!3/d1acc/8
【问题讨论】:
-
你已经掌握了所有的知识,如果有一个sqlfiddle.会很有帮助
-
请检查 SQL Fiddle。
-
最近有一个类似的问题,但我看不一样
-
@Used_By_Already,不!那是针对 TotalGroup 的问题。这是给
AvailableIn的。 -
@Used_By_Already,是的,这是不同的。
标签: sql sql-server sql-server-2008 pivot-table