在SQL表中创建事件总和表

时间:2018-01-12 13:31:30

标签: sql

我正在尝试从格式

转动表格
| 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的新手,所以我很欣赏如何解决这个问题。

2 个答案:

答案 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,我将存储DATEIDDATE,它将如下所示:

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