得到每个日期的计数,并将日期值作为列

时间:2017-07-14 15:16:10

标签: sql sql-server

我有一张包含值的表格;

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

如何获得此输出?请帮忙。

伙计我使用所提供解决方案的帮助获得了解决方案,但我遇到了一个问题。 Date列的顺序不是固定的顺序,我想以升序呈现日期列。我尝试使用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

1 个答案:

答案 0 :(得分:1)

您可以使用pivot并获得以下结果:

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

按如下所示更改列列生成以按Reg_date

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