使用SQLServer2008R2的透视表查询

使用SQLServer2008R2的透视表查询,sql,sql-server,sql-server-2008-r2,pivot,Sql,Sql Server,Sql Server 2008 R2,Pivot,下表中有两个字段,如下所示: 我想以垂直形式显示以下数据的透视表 表格:测试10 create table test_10 ( col1 varchar(10), col2 varchar(10) ); 插入记录: insert into test_10 values('A','2015-01-01'),('A','2015-01-05'),('A','2015-01-10'),('A','2015-02-15'), ('

下表中有两个字段,如下所示:

我想以垂直形式显示以下数据的透视表

表格
测试10

create table test_10
(
    col1 varchar(10),
    col2 varchar(10)
);
插入记录

insert into test_10 values('A','2015-01-01'),('A','2015-01-05'),('A','2015-01-10'),('A','2015-02-15'),
                            ('B','2015-01-01'),('B','2015-01-05'),('B','2015-01-10'),('B','2015-02-15'),
                            ('C','2015-02-02'),('C','2015-02-05'),('C','2015-02-08'),('C','2015-02-16');
ColX    Jan    Feb
-------------------                     
A       3      1
B       3      1
C       0      4
SELECT ColX,SUM(Jan) as Jan,SUM(Feb) as after
from
    ( 
        SELECT col1 as ColX,col1,
        (CASE WHEN col2 BETWEEN convert(date,'01-01-2015',105) AND convert(date,'31-01-2015',105) THEN count(col1) ELSE 0 END) as Jan, 
        (CASE WHEN col2 BETWEEN convert(date,'01-02-2015',105) AND convert(date,'28-02-2015',105) THEN count(col1) ELSE 0 end) as Feb
        from test_10
        Group By col1,col2
    ) a
Pivot 
(
    COUNT(col1)
    FOR col1 in([A],[B],[C])
)as pvt
GROUP BY ColX;  
预期结果

insert into test_10 values('A','2015-01-01'),('A','2015-01-05'),('A','2015-01-10'),('A','2015-02-15'),
                            ('B','2015-01-01'),('B','2015-01-05'),('B','2015-01-10'),('B','2015-02-15'),
                            ('C','2015-02-02'),('C','2015-02-05'),('C','2015-02-08'),('C','2015-02-16');
ColX    Jan    Feb
-------------------                     
A       3      1
B       3      1
C       0      4
SELECT ColX,SUM(Jan) as Jan,SUM(Feb) as after
from
    ( 
        SELECT col1 as ColX,col1,
        (CASE WHEN col2 BETWEEN convert(date,'01-01-2015',105) AND convert(date,'31-01-2015',105) THEN count(col1) ELSE 0 END) as Jan, 
        (CASE WHEN col2 BETWEEN convert(date,'01-02-2015',105) AND convert(date,'28-02-2015',105) THEN count(col1) ELSE 0 end) as Feb
        from test_10
        Group By col1,col2
    ) a
Pivot 
(
    COUNT(col1)
    FOR col1 in([A],[B],[C])
)as pvt
GROUP BY ColX;  
我的尝试

insert into test_10 values('A','2015-01-01'),('A','2015-01-05'),('A','2015-01-10'),('A','2015-02-15'),
                            ('B','2015-01-01'),('B','2015-01-05'),('B','2015-01-10'),('B','2015-02-15'),
                            ('C','2015-02-02'),('C','2015-02-05'),('C','2015-02-08'),('C','2015-02-16');
ColX    Jan    Feb
-------------------                     
A       3      1
B       3      1
C       0      4
SELECT ColX,SUM(Jan) as Jan,SUM(Feb) as after
from
    ( 
        SELECT col1 as ColX,col1,
        (CASE WHEN col2 BETWEEN convert(date,'01-01-2015',105) AND convert(date,'31-01-2015',105) THEN count(col1) ELSE 0 END) as Jan, 
        (CASE WHEN col2 BETWEEN convert(date,'01-02-2015',105) AND convert(date,'28-02-2015',105) THEN count(col1) ELSE 0 end) as Feb
        from test_10
        Group By col1,col2
    ) a
Pivot 
(
    COUNT(col1)
    FOR col1 in([A],[B],[C])
)as pvt
GROUP BY ColX;  
但得到结果

ColX    Jan    Feb
-------------------
A       1       1
B       1       1
C       0       1   

不需要pivot,请尝试条件聚合:

SELECT col1,
       SUM(CASE
             WHEN col2 BETWEEN CONVERT(DATE, '01-01-2015', 105) AND CONVERT(DATE, '31-01-2015', 105) THEN 1
             ELSE 0
           END) AS Jan,
       SUM(CASE
             WHEN col2 BETWEEN CONVERT(DATE, '01-02-2015', 105) AND CONVERT(DATE, '28-02-2015', 105) THEN 1
             ELSE 0
           END) AS Feb
FROM   test_10
GROUP  BY col1 

不需要pivot,请尝试条件聚合:

SELECT col1,
       SUM(CASE
             WHEN col2 BETWEEN CONVERT(DATE, '01-01-2015', 105) AND CONVERT(DATE, '31-01-2015', 105) THEN 1
             ELSE 0
           END) AS Jan,
       SUM(CASE
             WHEN col2 BETWEEN CONVERT(DATE, '01-02-2015', 105) AND CONVERT(DATE, '28-02-2015', 105) THEN 1
             ELSE 0
           END) AS Feb
FROM   test_10
GROUP  BY col1 

不需要pivot,请尝试条件聚合:

SELECT col1,
       SUM(CASE
             WHEN col2 BETWEEN CONVERT(DATE, '01-01-2015', 105) AND CONVERT(DATE, '31-01-2015', 105) THEN 1
             ELSE 0
           END) AS Jan,
       SUM(CASE
             WHEN col2 BETWEEN CONVERT(DATE, '01-02-2015', 105) AND CONVERT(DATE, '28-02-2015', 105) THEN 1
             ELSE 0
           END) AS Feb
FROM   test_10
GROUP  BY col1 

不需要pivot,请尝试条件聚合:

SELECT col1,
       SUM(CASE
             WHEN col2 BETWEEN CONVERT(DATE, '01-01-2015', 105) AND CONVERT(DATE, '31-01-2015', 105) THEN 1
             ELSE 0
           END) AS Jan,
       SUM(CASE
             WHEN col2 BETWEEN CONVERT(DATE, '01-02-2015', 105) AND CONVERT(DATE, '28-02-2015', 105) THEN 1
             ELSE 0
           END) AS Feb
FROM   test_10
GROUP  BY col1 

以下是你的答案:

SELECT ColX,SUM(Jan) as Jan,SUM(Feb) as Feb
from
    ( 
        SELECT col1 as ColX,col1,
        sum(CASE WHEN col2 BETWEEN convert(date,'01-01-2015',105) AND convert(date,'31-01-2015',105) THEN 1 ELSE 0 END) as Jan, 
        sum(CASE WHEN col2 BETWEEN convert(date,'01-02-2015',105) AND convert(date,'28-02-2015',105) THEN 1 ELSE 0 end) as Feb
        from test_10
        Group By col1
    ) a
Pivot 
(
    COUNT(col1)
    FOR col1 in([A],[B],[C])
)as pvt
GROUP BY ColX;  
输出:

ColX   Jan  Feb
A       3   1
B       3   1
C       0   4

以下是你的答案:

SELECT ColX,SUM(Jan) as Jan,SUM(Feb) as Feb
from
    ( 
        SELECT col1 as ColX,col1,
        sum(CASE WHEN col2 BETWEEN convert(date,'01-01-2015',105) AND convert(date,'31-01-2015',105) THEN 1 ELSE 0 END) as Jan, 
        sum(CASE WHEN col2 BETWEEN convert(date,'01-02-2015',105) AND convert(date,'28-02-2015',105) THEN 1 ELSE 0 end) as Feb
        from test_10
        Group By col1
    ) a
Pivot 
(
    COUNT(col1)
    FOR col1 in([A],[B],[C])
)as pvt
GROUP BY ColX;  
输出:

ColX   Jan  Feb
A       3   1
B       3   1
C       0   4

以下是你的答案:

SELECT ColX,SUM(Jan) as Jan,SUM(Feb) as Feb
from
    ( 
        SELECT col1 as ColX,col1,
        sum(CASE WHEN col2 BETWEEN convert(date,'01-01-2015',105) AND convert(date,'31-01-2015',105) THEN 1 ELSE 0 END) as Jan, 
        sum(CASE WHEN col2 BETWEEN convert(date,'01-02-2015',105) AND convert(date,'28-02-2015',105) THEN 1 ELSE 0 end) as Feb
        from test_10
        Group By col1
    ) a
Pivot 
(
    COUNT(col1)
    FOR col1 in([A],[B],[C])
)as pvt
GROUP BY ColX;  
输出:

ColX   Jan  Feb
A       3   1
B       3   1
C       0   4

以下是你的答案:

SELECT ColX,SUM(Jan) as Jan,SUM(Feb) as Feb
from
    ( 
        SELECT col1 as ColX,col1,
        sum(CASE WHEN col2 BETWEEN convert(date,'01-01-2015',105) AND convert(date,'31-01-2015',105) THEN 1 ELSE 0 END) as Jan, 
        sum(CASE WHEN col2 BETWEEN convert(date,'01-02-2015',105) AND convert(date,'28-02-2015',105) THEN 1 ELSE 0 end) as Feb
        from test_10
        Group By col1
    ) a
Pivot 
(
    COUNT(col1)
    FOR col1 in([A],[B],[C])
)as pvt
GROUP BY ColX;  
输出:

ColX   Jan  Feb
A       3   1
B       3   1
C       0   4