如何在SQL Server中的pivot语句中编写where子句

时间:2015-08-01 12:47:06

标签: sql sql-server

我需要根据项目和年份获得记录

SELECT 
    *
FROM   
    (SELECT 
         Source,
         val,
         month
     FROM   
         tbl_OrganicResult
     CROSS APPLY 
         (VALUES ('visitors', visitors),
                 ('UniqueVisitors', UniqueVisitors),
                 ('ReturnVisitors', ReturnVisitors)) cs (Source, val)) A  
PIVOT (Max(val)
FOR month IN ([jun], [jul)) pv 

我需要记录的条件如

select * 
from tbl_OrganicResult 
where project = 'Homeocare' 

示例数据

ProjectName Month  Year      visitors   UniqueVisitors  ReturnVisitors
Homeocare   Jun    2015      400        33              22
Homeocare   Jul    2015      100        10              8
debug test. Aug    2015      15222      122             120
debug test. Jun.   2015      1500       150             15
debug test. Jul    2015      1400       140             14

我收到这样的记录是不正确的,我的意思是我没有得到项目明智。

如何添加条件以获得项目的位置 - 'homeocare'?

获得这样的输出

Source             jun         jul
ReturnVisitors     8           120
UniqueVisitors     10          122
Visitors           100         15222 

我需要这样的记录

Source                jun    jul
ReturnVisitors.       22     8
UniqueVisitors.       33     10
Visitors              400    100   

很抱歉我错误地提供了错误的数据(早些时候)。这里总是得到最后2条记录,并没有用于条件获取记录项目和年度明智。

2 个答案:

答案 0 :(得分:0)

在你的情况下,你有三个月,但你正在寻找7月代替7月和8月代替7月只为这些列添加别名

declare @table table (ProjectName varchar(20), Month  varchar(20),  Year varchar(20),   visitors INT,   UniqueVisitors INT,  ReturnVisitors INT)
insert into @table (ProjectName,Month,Year,visitors,UniqueVisitors,ReturnVisitors)values 
('Homeocare' ,  'Jun'  ,  2015 ,   400  ,          33     ,         22),
('Homeocare' ,  'Jul' ,   2015 ,   100 ,            10   ,           8),
('debug test',  'Aug' ,   2015 ,   15222  ,        122  ,          120 ) 



SELECT source,JUN as Jul,jul as aug FROM   (SELECT Source,
               val,
               month
        FROM   @table
               CROSS apply (VALUES ('visitors',visitors),
                                   ('UniqueVisitors',UniqueVisitors),
                                   ('ReturnVisitors',ReturnVisitors)) cs (Source, val)) A  
       PIVOT (max(val)
             FOR month IN ([jun],[Jul],
                           [Aug])) pv 

答案 1 :(得分:0)

where子句应该在cross apply后面这样:

SELECT 
    *
FROM   
    (
    SELECT 
         Source,
         val,
        Year,
         month
     FROM   
         tbl_OrganicResult        
     CROSS APPLY 
         (VALUES ('visitors', visitors),
                 ('UniqueVisitors', UniqueVisitors),
                 ('ReturnVisitors', ReturnVisitors)) cs (Source, val)
     WHERE ProjectName = 'Homeocare' 
    ) A  
PIVOT ( Max(val) FOR Month IN ([jun], [jul]) ) pv 

除非您的表中只有一年的数据,否则此查询将为您提供当月记录数据的任何一年的最大值,例如,如果您在6月15日有200名访客,则有200名访客在6月14日,将选择6月14日的价值。这可能不是你想要的。

我会考虑做这样的事情:

SELECT 
    Source, [Jun-2015], [Jul-2015]
FROM   
    (
    SELECT 
         Source,
         Val,
        MonthYear = CONCAT(Month,'-',Year)
     FROM   
         tbl_OrganicResult        
     CROSS APPLY 
         (VALUES ('Visitors', visitors),
                 ('UniqueVisitors', UniqueVisitors),
                 ('ReturnVisitors', ReturnVisitors)) cs (Source, Val)
     WHERE ProjectName = 'Homeocare'
    ) A  
PIVOT ( MAX(Val) FOR MonthYear IN ([Jun-2015], [Jul-2015]) ) pv ;