我有一张包含值的表格;
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
答案 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,'')