我正在尝试从格式
转动表格| ID | access date |
--------------
| 1 | 08.10|
| 1 | 08.10|
| 4 | 08.10|
| 2 | 02.09|
到
|ID | 02.09 | 03.09 | 04.09 | ....
| 1 | 4 | 0 | 2 |
| 2 | 1 | 2 | 5 |
| 3 |
.
.
.
我尝试过使用PIVOT功能,但由于我有很多不同的日期,所以我不想输入查询
SELECT *
FROM (
SELECT [Sequence of events] as ID
,[Submission Date] as access_date
FROM [database_name].[dbo].[Event Logging]
) AS SOURCE_TABLE
PIVOT( SUM(ID) for access_date IN ("08.01", "09.01", "10.01"....)
) as pvt_table
我是SQL的新手,所以我很欣赏如何解决这个问题。
答案 0 :(得分:0)
尝试这样,你需要动态的sql,注意脚本没有测试出来,当你命名你的列时尽量没有空间,以太使用CamelCase或下划线来分隔单词
最后,这是SQL-Server
,因为您没有标记任何内容,而您的代码看起来像sql-server
declare @cols nvarchar(max)
select @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME([Submission Date])
from [database_name].[dbo].[Event Logging]
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
declare @sql nvarchar(max);
set @sql = '
SELECT *
FROM (
SELECT [Sequence of events] as ID
,[Submission Date] as access_date
FROM [database_name].[dbo].[Event Logging]
) AS SOURCE_TABLE
PIVOT( SUM(ID) for access_date IN (' + @cols + ')
) as pvt_table';
-- print (@sql)
execute (@sql)
答案 1 :(得分:0)
这不是以你的方式解决问题的答案,而是以另一种方式解决问题。
我要做的是创建2个表。第一个将被称为DATE_DB
,我将存储DATEID
和DATE
,它将如下所示:
| DATEID | DATE |
| 1 | 01.01|
| 2 | 02.02|
....
然后在第二个表中我存储如下数据:
| ID | DATEID | VALUE |
| 1 | 2 | 10 |
| 2 | 2 | 3 |
| 3 | 3 | 4 |
| 4 | 2 | 5 |
所以在第二个表中,列ID仅用于主键,除了像这样的表和JOIN
命令之外没有任何关系,你可以像这样使用它:
SELECT DATE_DB.DATE, SECONDTABLE.VALUE
FROM SECONDTABLE
LEFT JOIN DATE_DB ON SECONDTABLE.DATEID = DATE_DB.DATE
ORDER BY DATE_DB.DATE
将显示如下结果:
| DATE | VALUE |
| 02.01 | 10 |
| 02.01 | 3 |
| 02.01 | 5 |
| 03.01 | 4 |