Mysql 显示多列中所有日期的计数-高级SQL
我有一张像这样的桌子Mysql 显示多列中所有日期的计数-高级SQL,mysql,sql,sql-server,sql-server-2008,Mysql,Sql,Sql Server,Sql Server 2008,我有一张像这样的桌子 Dept | TicketCode | AsOfDate |FixedBy | FixedDate -------------------------------------------------------------------------------- merlin | ACE4E957-62C9-4447-A39E-AAA6928C7DD3 | 2014-03-04 | Mark | 2014-03-
Dept | TicketCode | AsOfDate |FixedBy | FixedDate
--------------------------------------------------------------------------------
merlin | ACE4E957-62C9-4447-A39E-AAA6928C7DD3 | 2014-03-04 | Mark | 2014-03-05
merlin | 95C5AF27-3211-E211-8E73-002481E28F48 | 2014-02-27 | Mark | 2014-03-06
merlin | 581CE204-3586-E211-A244-002481E28F48 | 2014-02-27 | Ravi | 2014-03-06
merlin | E9E6C0C6-7562-4265-82B0-5D14E3FEC674 | 2014-03-17 | Olive | 2014-03-18
omega | 1922DD26-3211-E211-8E73-002481E28F48 | 2014-03-18 | Sandy | 2014-03-19
merlin | 94E6EF27-3211-E211-8E73-002481E28F48 | 2014-03-18 | Ravi | 2014-03-19
omega | E7F5EF27-3211-E211-8E73-002481E28F48 | 2014-03-18 | Sandy | 2014-03-19
omega | CF8D4227-3211-E211-8E73-002481E28F48 | 2014-03-19 | Olive | 2014-03-20
omega | 1A904227-3211-E211-8E73-002481E28F48 | 2014-03-19 | Ravi | 2014-03-20
merlin | DCA94227-3211-E211-8E73-002481E28F48 | 2014-03-19 | Steve | 2014-03-20
Pine | 349E868F-DFFB-43DC-B50E-A9FFBF553908 | 2014-03-19 | Steve | 2014-03-20
merlin | 281FDD26-3211-E211-8E73-002481E28F48 | 2014-03-20 | Olive | 2014-03-21
omega | FDB6AF27-3211-E211-8E73-002481E28F48 | 2014-03-20 | Steve | 2014-03-21
omega | B8A1A320-FD0E-45AD-8A5D-9E92529806CD | 2014-04-29 | Ravi | 2014-04-30
omega | B8A1A320-FD0E-45AD-8A5D-9E92529806CD | 2014-04-29 | Olive | 2014-04-30
Pine | 5369D01E-BA2E-4AA6-A228-A9073BC0AE1B | 2014-04-29 | Steve | 2014-04-30
Pine | 1B59E55F-4AFB-490C-901C-82E0743748C6 | 2014-04-30 | Sandy | 2014-05-01
Pine | B326348F-E838-42FD-BECB-A8071175BC27 | 2014-04-30 | Ravi | 2014-05-01
Merlin | B326348F-E838-42FD-BECB-A8071175BC27 | 2014-04-30 | Sandy | 2014-05-01
现在我的要求是,我应该显示的表应该是
基于给定日期范围的变量列,并且我应该计算“TicketCode”
带有dept、FixedBy、FixedDate的过滤器
简单地说,这就是我应该得到的
--给定日期范围
@start_date = '2014-03-05'
@end_date = '2014-03-08'
Dept | FixedBy | 2014-03-05 | 2014-03-06 | 2014-03-07 | 2014-03-08 |
-----------------------------------------------------------------------
merlin | Mark | 20 | 111 | 24 | 853 |
merlin | Ravi | 26 | 456 | 289 | 463 |
merlin | Mark | 85 | 81 | 24 | 801 |
merlin | Steve | 75 | 0 | 0 | 1157 |
merlin | Sandy | 0 | 78 | 24 | 789 |
merlin | Mark | 166 | 110 | 0 | 176 |
omega | Ravi | 126 | 7456 | 289 | 63 |
omega | Mark | 885 | 81 | 284 | 01 |
omega | Steve | 975 | 0 | 0 | 157 |
omega | Sandy | 90 | 78 | 24 | 79 |
omega | Mark | 166 | 10 | 0 | 76 |
Pine | Sandy | 0 | 78 | 24 | 789 |
Pine | Mark | 166 | 10 | 0 | 106 |
Pine | Ravi | 126 | 746 | 289 | 63 |
注:计数以票号为基础,日期范围不固定。代码可以包含#临时表
Mark可能为所有部门工作,但我们只需要给定日期和贡献进度的部门静态数据
我已经尝试了我能找到的所有可用资源。
我就是无法通过
仅供参考:日期范围是手动给定的,因此列的计数不同。
代码可以包含#临时表
,但不包含创建函数(我不是管理员)
非常感谢。这里是一些MS-SQL代码,可以提供您想要的结果。它创建一个dynamics sSQL脚本并执行该脚本以获得结果。如果这不能100%解决你的问题,我希望它至少能为你指明正确的方向
CREATE TABLE #Data (Dept VARCHAR(20),TicketCode VARCHAR(100), AsOfDate DATETIME, FixedBy VARCHAR(10), FixedDate DATETIME)
DECLARE @StartDate AS DATETIME
DECLARE @EndDate AS DATETIME
DECLARE @ProcessDate AS DATETIME
DECLARE @sSQL AS VARCHAR(MAX)
DECLARE @dtString AS VARCHAR(100)
SET @StartDate = '2014-03-19'
SET @EndDate = '2014-03-21'
INSERT INTO #Data (Dept, TicketCode, AsOfDate, FixedBy, FixedDate) VALUES('merlin ',' ACE4E957-62C9-4447-A39E-AAA6928C7DD3 ',' 2014-03-04 ',' Mark ',' 2014-03-05 ')
INSERT INTO #Data (Dept, TicketCode, AsOfDate, FixedBy, FixedDate) VALUES('merlin ',' 95C5AF27-3211-E211-8E73-002481E28F48 ',' 2014-02-27 ',' Mark ',' 2014-03-06')
INSERT INTO #Data (Dept, TicketCode, AsOfDate, FixedBy, FixedDate) VALUES('merlin ',' 581CE204-3586-E211-A244-002481E28F48 ',' 2014-02-27 ',' Ravi ',' 2014-03-06')
INSERT INTO #Data (Dept, TicketCode, AsOfDate, FixedBy, FixedDate) VALUES('merlin ',' E9E6C0C6-7562-4265-82B0-5D14E3FEC674 ',' 2014-03-17 ',' Olive ',' 2014-03-18')
INSERT INTO #Data (Dept, TicketCode, AsOfDate, FixedBy, FixedDate) VALUES('omega ',' 1922DD26-3211-E211-8E73-002481E28F48 ',' 2014-03-18 ',' Sandy ',' 2014-03-19')
INSERT INTO #Data (Dept, TicketCode, AsOfDate, FixedBy, FixedDate) VALUES('merlin ',' 94E6EF27-3211-E211-8E73-002481E28F48 ',' 2014-03-18 ',' Ravi ',' 2014-03-19')
INSERT INTO #Data (Dept, TicketCode, AsOfDate, FixedBy, FixedDate) VALUES('omega ',' E7F5EF27-3211-E211-8E73-002481E28F48 ',' 2014-03-18 ',' Sandy ',' 2014-03-19')
INSERT INTO #Data (Dept, TicketCode, AsOfDate, FixedBy, FixedDate) VALUES('omega ',' CF8D4227-3211-E211-8E73-002481E28F48 ',' 2014-03-19 ',' Olive ',' 2014-03-20')
INSERT INTO #Data (Dept, TicketCode, AsOfDate, FixedBy, FixedDate) VALUES('omega ',' 1A904227-3211-E211-8E73-002481E28F48 ',' 2014-03-19 ',' Sandy ',' 2014-03-19')
INSERT INTO #Data (Dept, TicketCode, AsOfDate, FixedBy, FixedDate) VALUES('merlin ',' DCA94227-3211-E211-8E73-002481E28F48 ',' 2014-03-19 ',' Steve ',' 2014-03-20')
INSERT INTO #Data (Dept, TicketCode, AsOfDate, FixedBy, FixedDate) VALUES('Pine ',' 349E868F-DFFB-43DC-B50E-A9FFBF553908 ',' 2014-03-19 ',' Steve ',' 2014-03-20')
INSERT INTO #Data (Dept, TicketCode, AsOfDate, FixedBy, FixedDate) VALUES('merlin ',' 281FDD26-3211-E211-8E73-002481E28F48 ',' 2014-03-20 ',' Olive ',' 2014-03-21')
INSERT INTO #Data (Dept, TicketCode, AsOfDate, FixedBy, FixedDate) VALUES('omega ',' FDB6AF27-3211-E211-8E73-002481E28F48 ',' 2014-03-20 ',' Steve ',' 2014-03-21')
INSERT INTO #Data (Dept, TicketCode, AsOfDate, FixedBy, FixedDate) VALUES('omega ',' B8A1A320-FD0E-45AD-8A5D-9E92529806CD ',' 2014-04-29 ',' Ravi ',' 2014-04-30')
INSERT INTO #Data (Dept, TicketCode, AsOfDate, FixedBy, FixedDate) VALUES('omega ',' B8A1A320-FD0E-45AD-8A5D-9E92529806CD ',' 2014-04-29 ',' Olive ',' 2014-04-30')
INSERT INTO #Data (Dept, TicketCode, AsOfDate, FixedBy, FixedDate) VALUES('Pine ',' 5369D01E-BA2E-4AA6-A228-A9073BC0AE1B ',' 2014-04-29 ',' Steve ',' 2014-04-30')
INSERT INTO #Data (Dept, TicketCode, AsOfDate, FixedBy, FixedDate) VALUES('Pine ',' 1B59E55F-4AFB-490C-901C-82E0743748C6 ',' 2014-04-30 ',' Sandy ',' 2014-05-01')
INSERT INTO #Data (Dept, TicketCode, AsOfDate, FixedBy, FixedDate) VALUES('Pine ',' B326348F-E838-42FD-BECB-A8071175BC27 ',' 2014-04-30 ',' Ravi ',' 2014-05-01')
INSERT INTO #Data (Dept, TicketCode, AsOfDate, FixedBy, FixedDate) VALUES('Merlin ',' B326348F-E838-42FD-BECB-A8071175BC27 ',' 2014-04-30 ',' Sandy ',' 2014-05-01')
SET @ProcessDate = @StartDate
SET @sSQL = 'SELECT Dept,FixedBy '
/*Create the Dynamics SQL for the Columns*/
WHILE @ProcessDate < @EndDate
BEGIN
SET @dtString = CAST(YEAR(@ProcessDate) AS CHAR(4)) + '_' + CAST(MONTH(@ProcessDate) AS VARCHAR(2)) + '_' + CAST(DAY(@ProcessDate) AS VARCHAR(2))
SET @sSQL = @sSQL + ',
SUM(CASE WHEN FixedDate = ''' + CAST(@ProcessDate AS CHAR(20)) + ''' THEN 1 ELSE 0 END) AS dt_' + @dtString
SET @ProcessDate = @ProcessDate + 1
END
SET
@sSQL = @sSQL + ' FROM #Data GROUP BY Dept,FixedBy ORDER BY Dept,FixedBy '
SELECT @sSQL /*To see what will execute*/
EXECUTE (@sSQL) /*Run the Query to return results*/
DROP TABLE #Data /*Remove table*/
CREATE TABLE#Data(Dept VARCHAR(20)、TicketCode VARCHAR(100)、AsOfDate DATETIME、FixedBy VARCHAR(10)、FixedDate DATETIME)
将@StartDate声明为DATETIME
将@EndDate声明为DATETIME
将@ProcessDate声明为DATETIME
将@sSQL声明为VARCHAR(MAX)
将@dtString声明为VARCHAR(100)
设置为起始日期='2014-03-19'
设置@EndDate='2014-03-21'
在#数据(部门、票证代码、AsOfDate、FixedBy、FixedDate)中插入值('merlin','ACE4E957-62C9-4447-A39E-AAA6928C7DD3','2014-03-04','Mark','2014-03-05')
在#数据(部门、票证代码、AsOfDate、FixedBy、FixedDate)中插入值('merlin','95C5AF27-3211-E211-8E73-002481E28F48','2014-02-27','Mark','2014-03-06')
在#数据(部门、票证代码、AsOfDate、FixedBy、FixedDate)中插入值(“梅林”、“581CE204-3586-E211-A244-002481E28F48”、“2014-02-27”、“拉维”、“2014-03-06”)
在#数据(部门、票证代码、AsOfDate、FixedBy、FixedDate)中插入值('merlin','E9E6C0C6-7562-4265-82B0-5D14E3FEC674','2014-03-17','Olive','2014-03-18')
在#数据(部门、票证代码、AsOfDate、FixedBy、FixedDate)中插入值('omega','1922DD26-3211-E211-8E73-002481E28F48','2014-03-18','Sandy','2014-03-19')
在#数据(部门、票证代码、AsOfDate、FixedBy、FixedDate)中插入值('merlin','94E6EF27-3211-E211-8E73-002481E28F48','2014-03-18','Ravi','2014-03-19')
在#数据(部门、票证代码、AsOfDate、FixedBy、FixedDate)中插入值('omega','E7F5EF27-3211-E211-8E73-002481E28F48','2014-03-18','Sandy','2014-03-19')
在#数据(部门、票证代码、AsOfDate、FixedBy、FixedDate)中插入值('omega','CF8D4227-3211-E211-8E73-002481E28F48','2014-03-19','Olive','2014-03-20')
在#数据(部门、票证代码、AsOfDate、FixedBy、FixedDate)中插入值('omega','1A904227-3211-E211-8E73-002481E28F48','2014-03-19','Sandy','2014-03-19')
在#数据(部门、票证代码、AsOfDate、FixedBy、FixedDate)中插入值('merlin','DCA94227-3211-E211-8E73-002481E28F48','2014-03-19','Steve','2014-03-20')
在#数据(部门、票证代码、AsOfDate、FixedBy、FixedDate)中插入值(“Pine”、“349E868F-DFFB-43DC-B50E-A9FFBF553908”、“2014-03-19”、“Steve”、“2014-03-20”)
在#数据(部门、票证代码、AsOfDate、FixedBy、FixedDate)中插入值('merlin','281FDD26-3211-E211-8E73-002481E28F48','2014-03-20','Olive','2014-03-21')
在#数据(部门、票证代码、AsOfDate、FixedBy、FixedDate)中插入值('omega','FDB6AF27-3211-E211-8E73-002481E28F48','2014-03-20','Steve','2014-03-21')
在#数据(部门、票证代码、AsOfDate、FixedBy、FixedDate)中插入值(“欧米茄”、“B8A1A320-FD0E-45AD-8A5D-9E92529806CD”、“2014-04-29”、“拉维”、“2014-04-30”)
在#数据(部门、票证代码、AsOfDate、FixedBy、FixedDate)中插入值('omega','B8A1A320-FD0E-45AD-8A5D-9E92529806CD','2014-04-29','Olive','2014-04-30')
在#数据(部门、票证代码、AsOfDate、FixedBy、FixedDate)中插入值(“Pine”、“5369D01E-BA2E-4AA6-A228-A9073BC0AE1B”、“2014-04-29”、“Steve”、“2014-04-30”)
在数据(部门、票证代码、AsOfDate、FixedBy、FixedDate)中插入值(“Pine”、“1B59E55F-4AFB-490C-901C-82E0743748C6”、“2014-04-30”、“Sandy”、“2014-05-01”)
在#数据(部门、票证代码、AsOfDate、FixedBy、FixedDate)中插入值(“Pine”、“B326348F-E838-42FD-BECB-A8071175BC27”、“2014-04-30”、“Ravi”、“2014-05-01”)
在#数据(部门、票证代码、AsOfDate、FixedBy、FixedDate)中插入值(“梅林”、“B326348F-E838-42FD-BECB-A8071175BC27”、“2014-04-30”、“桑迪”、“2014-05-01”)
设置@ProcessDate=@StartDate
SET@sSQL='SELECT Dept,FixedBy'
/*为列创建动态SQL*/
而@ProcessDate<@EndDate
开始
将@dtString=CAST(年(@ProcessDate)设置为CHAR(4))+''.'+CAST(月(@ProcessDate)设置为VARCHAR(2))+'.'+CAST(日(@ProcessDate)设置为VARCHAR(2))
设置@sSQL=@sSQL+',
SUM(当FixedDate='''+CAST(@ProcessDate作为CHAR(20))+''s然后1或0结束时的情况)作为dt_'+@dtString
设置@ProcessDate=@ProcessDate+1
终止
设置
@sSQL=@sSQL+'来自#数据组,按部门,按订单,按部门,按固定'
选择@sSQL/*查看将执行的操作*/
执行(@sSQL)/*运行查询以返回结果*/
删除表格#数据/*删除表格*/
使用dynamic pivot解决此问题相对容易。但是,您的结果与您的数据不匹配——在“2014-03-05”和“2014-03-08”之间的样本数据中只有两行
代码如下:
declare @start_date as date,
@end_date as date;
select @start_date = '2014-03-05', @end_date = '2014-03-08';
declare @collist nvarchar(max)
set @collist = stuff((select distinct ',' + quotename(convert(varchar(8), FixedDate, 112))
from #t -- your table here
where FixedDate between @start_date and @end_date
for xml path(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'')
declare @q nvarchar(max)
set @q = '
select Dept, FixedBy, ' + @collist + '
from (
select Dept, FixedBy, FixedDate, TicketCode
from (
select *
from #t -- your table here
where FixedDate between ''' + convert(varchar(8),@start_date,112) + ''' and ''' + convert(varchar(8),@end_date,112) + '''
) as x
) as source
pivot (
count(TicketCode)
for FixedDate in (' + @collist + ')
) as pvt
'
exec (@q)
结果(使用@Richard,thx的插入脚本):
感谢您介绍pivot概念。但是,我得到的结果只有一行。(一直)你能修改它吗?不管怎样,@Ritchardvivian查询就像上面说的那样100%工作,但是,我希望看到h
Dept FixedBy 20140305 20140306
-------------------- ---------- ----------- -----------
merlin Mark 1 1
merlin Ravi 0 1