[英]Pivot table using SQL Server 2008 R2
I am getting count issue in the pivot table query using the SQL Server 2008 R2. 我在使用SQL Server 2008 R2的数据透视表查询中遇到计数问题。
Example : 范例 :
I have a table testrf
: 我有一个表testrf
:
CREATE TABLE testrf
(
cola INTEGER,
colb VARCHAR(10)
)
With some data: 有一些数据:
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')
Looks like this: 看起来像这样:
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
12 M1
13 L1
14 C2
My Pivot table query: 我的数据透视表查询:
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,'+ @cols +'
FROM
(SELECT v.cola,v.colb
FROM testrf AS v
GROUP BY v.cola,v.colb
) p
PIVOT
(
count(colb)
FOR colb IN ( '+ @cols + ' )
) AS pvt';
EXEC(@SQL)
Getting Result: 获得结果:
cola c C2 d L1 M1 x y
----------------------------------
1 0 0 0 0 0 1 0
2 0 0 0 0 0 1 0
3 0 0 0 0 0 0 1
4 0 0 0 0 0 0 1
5 1 0 0 0 0 0 0
6 1 0 0 0 0 0 0
7 1 0 0 0 0 0 0
8 0 0 1 0 0 0 0
12 0 0 0 0 1 0 0
13 0 0 0 1 0 0 0
14 0 1 0 0 0 0 0
Note : colb=x
is occurred 2 times for cola=1
and colb=y
occurred 2 times for cola=3
. 注意 : colb=x
对于cola=1
发生了2次,而colb=y
对于cola=3
发生了2次。 Getting counting issue here. 在这里开始计数问题。
You don't require the GROUP BY clause within the inner subquery (p) 您不需要内部子查询(p)中的GROUP BY子句
DECLARE @cols NVARCHAR(MAX)
DECLARE @SQL NVARCHAR(MAX)
SELECT @cols = STUFF ( (SELECT DISTINCT ',' + QUOTENAME(v.colb)
FROM testrf AS v
FOR XML PATH('')), 1, 1, '')
SET @SQL = N'SELECT cola,'+ @cols +'
FROM
(SELECT v.cola,v.colb
FROM testrf AS v
) p
PIVOT
(
count(colb)
FOR colb IN ( '+ @cols + ' )
) AS pvt'
EXEC(@SQL)
;
I have also proposed a change to your @cols by using QUOTENAME() 我还建议使用QUOTENAME()更改您的@cols
From your sample data this produces the following result: 根据您的样本数据,将产生以下结果:
| COLA | C | C2 | D | L1 | M1 | X | Y |
|------|---|----|---|----|----|---|---|
| 1 | 0 | 0 | 0 | 0 | 0 | 2 | 0 |
| 2 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
| 3 | 0 | 0 | 0 | 0 | 0 | 0 | 2 |
| 4 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
| 5 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
| 6 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
| 7 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
| 8 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |
| 12 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
| 13 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
| 14 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.