auf jedes date zählen und dateswerte als Spalte machen

Ich habe einen Tisch mit Werten;

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 

Ich habe die Abfrage für das Erhalten der Zählung von CUST_TYPE geschrieben, aber wie man REG_DATE Wert als Spalte zeigt.

 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; 

Ich möchte die Anzahl von CUST_TYPE auf jedem REG_DATE erhalten, aber die Werte von REG_DATE sollten als Spalte erscheinen. Erforderliche Ausgabe ist ;

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

Wie bekomme ich diese Ausgabe? Bitte helfen Sie.

Jungs Ich habe die Lösung mit Hilfe von den Lösungen zur Verfügung gestellt, aber ich habe ein Problem. Die Reihenfolge der Date-Spalten ist nicht in fester Reihenfolge, ich möchte die datesspalten in aufsteigender Reihenfolge rendern. Ich habe versucht, ORDER BY-Klausel, aber jede Lösung, die ich versuchte, zeigt Fehler. Wie kann ich mein Ergebnis in der aufsteigenden Reihenfolge der datesspalte bestellen ?

 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 

Sie können Pivot verwenden und erhalten diese Ergebnisse wie folgt:

 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 

Ausgabe wie unten:

 +-----------+------------+------------+------------+------------+ | 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 | +-----------+------------+------------+------------+------------+ 

Für die dynamische list der Spalten können Sie wie folgt abfragen:

 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 

Ändern Sie Ihre Spalten-Spaltengenerierung wie unten, um nach Reg_date zu gelangen

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