簡體   English   中英

MSSQL 2012:使用PHP的PIVOT類型和日期

[英]MSSQL 2012 : PIVOT typologies and dates using PHP

我不正確地理解數據透視如何與MSSQL一起使用,並且我無法根據需要應用數據透視。

我有一個具有“類型”內容的MSSQL 2012數據庫:

Date (Unix) | Typo    | Other data
1459461600  | Typo 1  | ---
1459461600  | Typo 4  | ---
1459548000  | Typo 2  | ---
1459548000  | Typo 2  | ---
1459634400  | Typo 1  | ---
...

出於報告原因,我需要輸出一個類似表:

Typo     | 2016-04-01 | 2016-04-02 | 2016-04-03 | ...
Typo 1   |      1     |      0     |      1     | ...
Typo 2   |      0     |      2     |      0     | ...
Typo 3   |      0     |      0     |      0     | ...
Typo 4   |      1     |      0     |      0     | ...

我已經通過本主題完成的工作如何以日期為列動態進行透視

SELECT * INTO #Names
FROM
(
SELECT 1 ID,'Other' NAME 
UNION ALL
SELECT 2 ID,'Payment/Delivery' NAME 
UNION ALL
SELECT 3 ID,'Account cancellation ' NAME 
UNION ALL
...
) TAB

SELECT * INTO #Stockdates
FROM
(      
SELECT DISTINCT CAST(dateadd(S, [date_ticket], '1970-01-01') as date) AS [DATE] FROM [MyTable].[dbo].[ticket] WHERE date_ticket BETWEEN 1459461600 AND 1462053600
)TAB

#Names包含類型,#Stockdates包含2016年4月1日至2016年4月30日之間的日期

然后創建表和列:

SELECT N.NAME,S.[DATE]
INTO #TABLE
FROM #NAMES N, #Stockdates S

DECLARE @cols NVARCHAR (MAX)
SELECT @cols = COALESCE (@cols + ',[' + CONVERT(NVARCHAR, [DATE], 106) + ']', 
               '[' + CONVERT(NVARCHAR, [DATE], 106) + ']')
               FROM    (SELECT DISTINCT [DATE] FROM #TABLE) PV  
               ORDER BY [DATE]

最后是查詢:

DECLARE @query NVARCHAR(MAX)
SET @query = 'SELECT * FROM (
    SELECT * FROM #TABLE
) X 
PIVOT (
    COUNT(NAME) FOR [DATE] IN (' + @cols + ')
) p'
EXEC SP_EXECUTESQL @query

我知道我的SQL是不正確的,僅是向您顯示我正在使用它幾個小時,而我不知道該怎么做才能使其正常工作。

我需要將這些數據與PHP腳本一起使用,以便向用戶顯示錯字為行,日期為列的表,如果用戶選擇其他月份(例如3月),則日期將自動更新。

有人可以幫我嗎?

編輯:

借助@ JamieD77和其他測試,我簡化了Transact SQL:

DECLARE @cols NVARCHAR (MAX)

SELECT @cols = COALESCE (@cols + ',[' + CONVERT(NVARCHAR, [DATE], 103) + ']', 
               '[' + CONVERT(NVARCHAR, [DATE], 103) + ']')
               FROM    (SELECT DISTINCT [DATE] FROM (SELECT DISTINCT CAST(dateadd(S, [date_ticket], '1970-01-01') as date) AS [DATE] FROM [MyBase].[dbo].[ticket] WHERE date_ticket BETWEEN 1459461600 AND 1462053600) PV) PT
               ORDER BY [DATE]

PRINT @cols

DECLARE @query NVARCHAR(MAX)
SET @query = 'SELECT * FROM (
SELECT
    typo_1,
    CAST(dateadd(S, [date_ticket], ''1970-01-01'') as date) AS [DATE]
FROM 
    [MyBase].[dbo].[ticket] 
WHERE 
    date_ticket BETWEEN 1459461600 AND 1462053600
) X
PIVOT (
    COUNT(typo_1) FOR [DATE] IN ('+@cols+')
) p'

PRINT @query

EXEC SP_EXECUTESQL @query

並且它僅返回一行:

01/04/2016 | 02/04/2016 | 04/04/2016 | ...
   346     |     5      |     480    | ...

我認為我的PIVOT或先前的SELECT出問題了。 346是4月1日的錯字總額,但我看不到錯字的詳細信息。 我如何添加我的錯別字作為每天的錯字行和編號? 我認為這很容易,但是從今天早上開始我一直在研究它,但是我看不到明顯的問題:)

您沒有正確設置@cols值。

應該看起來像這樣。

DECLARE @cols NVARCHAR (MAX)
SELECT  @cols = COALESCE (@cols + ',', '') + QUOTENAME(CONVERT(NVARCHAR, [DATE], 106))
FROM    (SELECT DISTINCT [DATE] FROM #TABLE) PV  
ORDER BY [DATE]

如果您仍然遇到錯誤。 EXEC SP_EXECUTESQL @query PRINT @query之前使用PRINT @query來查看您的查詢,然后嘗試調試它的格式。 將結果發回,以便我們查看最終查詢的外觀。

由於透視查詢中只有2個字段,因此如果要查看type_1字段,請在date字段上使用合計。

PIVOT (
    COUNT([DATE]) FOR [DATE] IN ('+@cols+')
) p 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM