MSSQL 2012:使用 PHP 的 PIVOT 类型和日期
MSSQL 2012 : PIVOT typologies and dates using PHP
我没有正确理解 pivot 如何与 MS 一起工作SQL,而且我无法根据我的需要应用 pivot。
我有一个 MSSQL 2012 数据库 "typology" 内容:
Date (Unix) | Typo | Other data
1459461600 | Typo 1 | ---
1459461600 | Typo 4 | ---
1459548000 | Typo 2 | ---
1459548000 | Typo 2 | ---
1459634400 | Typo 1 | ---
...
出于报告原因,我需要输出一个 table,例如:
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 | ...
我已经在这个主题的帮助下做了什么How to pivot dynamically with date as column
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-04-01 到 2016-04-30 的日期
然后创建 table 和列 :
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 脚本一起使用,以便向用户显示一个 table,行中有拼写错误,列中有日期,如果用户 select 再过一个月 (如三月)日期将自动更新。
谁能帮我解决这个问题?
编辑:
在@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
它 returns 只有一行 :
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
来查看您的查询是什么样的,并尝试调试它完全形成。 Post 返回您的结果,这样我们就可以看到最终查询的样子。
由于您的透视查询中只有 2 个字段,如果您想查看 type_1 字段,请在日期字段上使用聚合..
PIVOT (
COUNT([DATE]) FOR [DATE] IN ('+@cols+')
) p
我没有正确理解 pivot 如何与 MS 一起工作SQL,而且我无法根据我的需要应用 pivot。
我有一个 MSSQL 2012 数据库 "typology" 内容:
Date (Unix) | Typo | Other data
1459461600 | Typo 1 | ---
1459461600 | Typo 4 | ---
1459548000 | Typo 2 | ---
1459548000 | Typo 2 | ---
1459634400 | Typo 1 | ---
...
出于报告原因,我需要输出一个 table,例如:
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 | ...
我已经在这个主题的帮助下做了什么How to pivot dynamically with date as column
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-04-01 到 2016-04-30 的日期
然后创建 table 和列 :
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 脚本一起使用,以便向用户显示一个 table,行中有拼写错误,列中有日期,如果用户 select 再过一个月 (如三月)日期将自动更新。
谁能帮我解决这个问题?
编辑:
在@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
它 returns 只有一行 :
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
来查看您的查询是什么样的,并尝试调试它完全形成。 Post 返回您的结果,这样我们就可以看到最终查询的样子。
由于您的透视查询中只有 2 个字段,如果您想查看 type_1 字段,请在日期字段上使用聚合..
PIVOT (
COUNT([DATE]) FOR [DATE] IN ('+@cols+')
) p