2017-07-14 49 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

相關問題