SQL数据透视中要从yyyy-mm-dd转换为mm-yy的日期
我在SQL Server 2016中使用了一个pivot查询,它的效果有些好:SQL数据透视中要从yyyy-mm-dd转换为mm-yy的日期,sql,sql-server,datetime,pivot,Sql,Sql Server,Datetime,Pivot,我在SQL Server 2016中使用了一个pivot查询,它的效果有些好: select * FROM (select Analyst,Task_Type,Load,Completed,Date_Of_Assignment from mytable where Task_Type IN ('Loans') ) as TEST PIVOT ( SUM(Completed) FOR [Date_Of_Assignment] IN ([2018-05-22],[2018-06-2
select *
FROM (select Analyst,Task_Type,Load,Completed,Date_Of_Assignment
from mytable where Task_Type IN ('Loans') ) as TEST PIVOT
(
SUM(Completed)
FOR
[Date_Of_Assignment] IN ([2018-05-22],[2018-06-22],[2018-07-22])
) as P
它返回为:
Agent_Name Task_Type Total_Received 2018-05-22 2018-06-22 2018-07-22
Steve Loans 20 15 15 15
Cathe Loans 20 15 15 15
Adam Loans 20 15 15 15
Klaus Loans 20 15 15 15
这很酷,但我更需要这样的
Agent_Name Task_Type Total_Received May 18 June 18 July 18
Steve Loans 20 15 15 15
Cathe Loans 20 15 15 15
Adam Loans 20 15 15 15
Klaus Loans 20 15 15 15
考虑到每个负载可能不止一天的数据,实际上应该是每个工作日
我尝试按日期分组,但它返回错误
如果我喜欢:
select *
FROM (select Analyst,Task_Type,Load,Completed,Date_Of_Assigment
CASE WHEN FORMAT(Date_Of_Assigment,'MM-yy') = '05-18' THEN 'May 18'
WHEN FORMAT(Date_Of_Assigment,'MM-yy') = '06-18' THEN 'Jun 18'
WHEN FORMAT(Date_Of_Assigment,'MM-yy') = '07-18' THEN 'Jul 18'
END AS MonthT
from mytable where Task_Type IN ('Loans') as TEST PIVOT
(
SUM(Completed)
FOR
[MonthT] IN (['May 18'],['Jun 18'],['Jul 18'])
) as P
我收到:
Analyst Task Total_Received 'May 18' 'Jun 18' 'Jul 18'
Steve Billing 20 NULL NULL NULL
Cathe Billing 20 NULL NULL NULL
Adam Billing 20 NULL NULL NULL
Klaus Billing 20 NULL NULL NULL
它会将日期转换为列,但只包含空值
数据类型有:日期分配的日期、任务类型的nvarchar和其他列的分析和整数
我做错了什么
非常感谢我会这样做:
select Analyst, Task,
sum(case when MonthT = '05-18' then Completed else 0 end) [May 18],
sum(case when MonthT = '06 18' then Completed else 0 end) [Jun 18],
sum(case when MonthT = '05-18' then Completed else 0 end) [Jul 18]
from table t cross apply
( values format (Date_Of_Assigment, 'MM-yy')
) tt (MonthT)
where Task_Type = 'Loans'
group by Analyst, Task;
试试这个:
SELECT
*
FROM (
SELECT
Analyst
, Task_Type
, [Load]
, Completed
, DATENAME( MM, Date_Of_Assignment ) + ' ' + CAST( ( YEAR( Date_Of_Assignment ) % 100 ) AS VARCHAR(2) ) AS Date_Of_Assignment
FROM mytable WHERE Task_Type IN ( 'Loans' )
) AS TEST
PIVOT (
SUM(Completed)
FOR
[Date_Of_Assignment] IN ( [May 18], [June 18], [July 18] )
) AS P
我无法访问您的数据来测试这一点,但从理论上讲,它应该满足您的要求
以下是您可以在SSMS中运行的简单概念证明:
DECLARE @mytable TABLE (
Analyst VARCHAR(10), Task_Type VARCHAR(10) DEFAULT 'Loans', [Load] INT, Completed INT, Date_Of_Assignment DATETIME
)
INSERT INTO @mytable ( Analyst, [Load], Completed, Date_Of_Assignment )
VALUES
( 'Steve', 3, 2, '05/22/2018' )
, ( 'Steve', 1, 1, '06/22/2018' )
, ( 'Steve', 4, 3, '07/22/2018' );
SELECT
Analyst, Task_Type, SUM( [Load] ) AS Total_Recieved, SUM( [May 18] ) AS [May 18], SUM( [June 18] ) AS [June 18], SUM( [July 18] ) AS [July 18]
FROM (
SELECT
Analyst
, Task_Type
, [Load]
, Completed
, DATENAME( MM, Date_Of_Assignment ) + ' ' + CAST( ( YEAR( Date_Of_Assignment ) % 100 ) AS VARCHAR(2) ) AS Date_Of_Assignment
FROM @mytable
WHERE Task_Type IN ( 'Loans' )
) AS TEST
PIVOT (
SUM( Completed ) FOR [Date_Of_Assignment] IN ( [May 18], [June 18], [July 18] )
) AS P
GROUP BY Analyst, Task_Type;
返回
+---------+-----------+----------------+--------+---------+---------+
| Analyst | Task_Type | Total_Recieved | May 18 | June 18 | July 18 |
+---------+-----------+----------------+--------+---------+---------+
| Steve | Loans | 8 | 2 | 1 | 3 |
+---------+-----------+----------------+--------+---------+---------+
大家好!感谢您的帮助,我删除了(['5月18日]、['6月18日]、['7月18日])中的[Monht]中的引号,现在它的效果非常好。再次感谢!