2017-07-14 23 views
0

我有一个表的值;得到每一个日期的计数和作为列的日期值

CUSTOMER_ID CUST_TYPE REG_DATE 
1706021001 GENERAL  2017-06-02 
1706021002 GENERAL  2017-06-02 
1707091001 GENERAL  2017-07-09 
1707091002 GENERAL  2017-07-09 
1707111001 STAFF  2017-07-11 
1707111002 STUDENT  2017-07-14 
1706021003 GENERAL  2017-07-14 

我已经写了查询获取CUST_TYPE的计数,但是如何显示REG_DATE值作为列。

SELECT [REG_DATE] 
    ,[CUST_TYPE] 
    ,COUNT(CUST_TYPE) [COUNT] 
FROM [dbo].[tbl_new_customer_registration] 
WHERE a.REG_DATE >= CONVERT(DATETIME, CONVERT(VARCHAR(10), '2017-06-02', 112)) 
    AND a.REG_DATE <= CONVERT(DATETIME, CONVERT(VARCHAR(10), '2017-07-11', 112)) 
GROUP BY CUST_TYPE,REG_DATE; 

我想要在每个REG_DATE获得CUST_TYPE的计数,但REG_DATE的值应显示为列。 要求的输出是;

CUST_TYPE  2017-06-02 2017-07-09 2017-07-11 2017-07-14 
GENERAL    2   2      1 
STAFF          1 
STUDENT             1 

我怎样才能得到这个输出?请帮忙。

伙计们我使用所提供的解决方案的帮助获得了解决方案,但是我遇到了一个问题。日期列的顺序不是固定顺序,我想按升序显示日期列。我尝试使用ORDER BY子句,但我尝试的每个解决方案都显示错误。 如何按日期列的升序来订购我的结果回转表?

DECLARE @query AS NVARCHAR(MAX) 
DECLARE @columns AS NVARCHAR(MAX) 
DECLARE @p_from_dt DATE = CONVERT(DATETIME, CONVERT(VARCHAR(10), '2017-06-02', 112)); 
DECLARE @p_to_dt DATE = CONVERT(DATETIME, CONVERT(VARCHAR(10), '2017-07-14', 112)); 

SELECT @columns = ISNULL(@columns + ',', '') + QUOTENAME(status_date) 
FROM (
    SELECT DISTINCT convert(VARCHAR(10), REG_DATE, 120) [status_date] 
    FROM [dbo].[tbl_new_customer_registration] a 
    WHERE a.REG_DATE >= @p_from_dt 
     AND a.REG_DATE <= @p_to_dt 
    ) AS TheDays 

SET @query = N' select * from 
     (SELECT a.REG_DATE [REG_DATE] 
     ,a.CUST_TYPE [CUST_TYPE] 
    FROM [dbo].[tbl_new_customer_registration] a 
    GROUP BY a.REG_DATE,a.CUST_TYPE 
    ) a 
pivot(COUNT(CUST_TYPE) FOR [REG_DATE] IN (' + @columns + ')) p 
     ' 

--print @columns 
EXEC SP_EXECUTESQL @query 
GO 
+2

谷歌:动态透视在SQL服务器 –

回答

1

您可以使用支点和得到这个结果如下:

Select * from (
    Select Customer_id, Cust_type, Reg_date from #customer) a 
    pivot (count(customer_id) for reg_date in ([2017-06-02],[2017-07-09],[2017-07-11],[2017-07-14])) p 

输出如下:

+-----------+------------+------------+------------+------------+ 
| Cust_type | 2017-06-02 | 2017-07-09 | 2017-07-11 | 2017-07-14 | 
+-----------+------------+------------+------------+------------+ 
| GENERAL |   2 |   2 |   0 |   1 | 
| STAFF  |   0 |   0 |   1 |   0 | 
| STUDENT |   0 |   0 |   0 |   1 | 
+-----------+------------+------------+------------+------------+ 

因为你可以按照以下查询列的动态列表:

declare @cols1 varchar(max) 
declare @query nvarchar(max) 

select @cols1 = stuff((select distinct ','+QuoteName(Reg_date) from #customer for xml path('')),1,1,'') 
Declare @p_from_dt date = '2017-06-02' 
Declare @p_to_dt date = '2017-07-14' 

Select @query = ' Select * from (
     Select Customer_id, Cust_type, Reg_date from #customer 
      Where Reg_date between @p_from_dt and @p_to_dt) a 
     pivot (count(customer_id) for reg_date in ('+ @cols1 + ')) p ' 

--Select @query --Check for generated query 
exec sp_executesql @query, N'@p_from_dt date, @p_to_dt date', @p_from_dt, @p_to_dt 

更改您的列co lumn一代下面由Reg_date为了得到

Select @cols1 = stuff((select ','+QuoteName(Reg_date) from #customer group by Reg_Date order by Reg_date for xml path('')),1,1,'') 
+0

请你能解释一下为什么你已经使用'用于XML路径(“”)),1,1,“”)' ? – user4221591

+1

从Reg_Date获取用逗号分隔的不同列名。 –

+0

感谢您的快速回复。如果此查询采用WHERE条件或不是WHERE REG_DATE = CONVERT(DATETIME,CONVERT(VARCHAR(10),@ p_from_dt,112)) \t \t AND REG_DATE <= CONVERT(VARCHAR(10),@p_to_dt ,112))'因为我的查询是动态的。 – user4221591

相关问题