SQL Server动态数据透视表与日期时间

时间:2015-10-01 10:03:55

标签: sql sql-server pivot

我正在尝试透视def search_files(folderid, search): files = session.query(file).filter( file.parentid==folderid, file.name.ilike('%{}%'.format(search))).all() folders = session.query(folder.ID).filter_by(parentid=folderid).all() for folder in folders: files+=search_files(folder.id, search) return files join_date)列并按年份+月分组并按datetime分组,并且必须是动态的,因为日期会发生变化。

mtype

期望的结果

+-------+------------------+
| Mtype |    join_date     |
+-------+------------------+
| A     | 28/05/2014 00:00 |
| B     | 04/11/2014 00:00 |
| C     | 23/03/2007 00:00 |
| D     | 04/09/2013 00:00 |
| E     | 26/11/2014 00:00 |
| F     | 24/07/2011 00:00 |
| G     | 28/05/2014 00:00 |
| A     | 20/06/2013 00:00 |
| B     | 04/11/2014 00:00 |
| C     | 20/06/2013 00:00 |
+-------+------------------+

这是我对查询的看法,但我无法弄清楚如何让Pivot正常工作

+-------+---------+---------+---------+---------+---------+---------+--------+--------+--------+
| Mtype | 2015-03 | 2015-02 | 2015-01 | 2014-12 | 2014-11 | 2014-10 | 2014-9 | 2014-8 | 2014-7 |
+-------+---------+---------+---------+---------+---------+---------+--------+--------+--------+
| A     |      45 |       7 |      54 |     875 |      45 |       7 |     54 |    875 |     25 |
| B     |       7 |      78 |      78 |       7 |       7 |      78 |     78 |      7 |     78 |
| C     |     546 |       6 |      87 |       5 |      45 |       6 |     87 |      5 |     25 |
| D     |      54 |      78 |      54 |       8 |      54 |      78 |     54 |      7 |      7 |
| E     |      78 |      78 |       7 |      45 |      78 |      78 |      7 |     45 |      6 |
| F     |      46 |      54 |       6 |       8 |      46 |      54 |      6 |      8 |     75 |
| G     |      54 |      87 |      87 |       7 |      54 |      87 |     87 |     45 |      8 |
+-------+---------+---------+---------+---------+---------+---------+--------+--------+--------+

1 个答案:

答案 0 :(得分:0)

这是生成输出的sql代码。

DECLARE @cols NVARCHAR (MAX)
DECLARE @query NVARCHAR (MAX)
SELECT @cols = COALESCE (@cols + ',[' + CONVERT(VARCHAR(7), join_date, 120) + ']', 
          '[' + CONVERT(VARCHAR(7), join_date, 120) + ']')
           FROM    (SELECT DISTINCT CONVERT(VARCHAR(7), join_date, 120) as join_date FROM Mdata) PV  
           ORDER BY join_date

SELECT @query = 'SELECT *
FROM
(
   SELECT Mtype, CONVERT(VARCHAR(7), join_date, 120) as join_date FROM Mdata
) AS t
PIVOT 
(
  COUNT(join_date) 
  FOR join_date IN( ' + @cols + ' )' +
') AS p ;'

EXEC SP_EXECUTESQL @query

以下是结果的截屏。

enter image description here

相关问题