Reputation: 271
In SQL I have a table with 3 column, include of :
ID NLV SGLV
m0001 27/03/2017 8
m0001 28/03/2017 3.5
m0002 28/03/2017 8
m0003 26/03/2017 12
M0001 27/03/2017 2
Now, I want to write an SQL query to create a new table have format follow:
ID SUM(SGLV) 26 (26/03/2017) 27 (27/03/2017) 28 (28/03/2017)
M0001 13.5 0 10 3.5
m0002 8 0 0 8
m0003 12 12 0 0
So, can anybody help me?
Upvotes: 0
Views: 141
Reputation: 647
In SQL Server, below query gives you the required output
DECLARE @SAMPLEDATA TABLE(ID VARCHAR(100), NLV DATETIME, SGLV DECIMAL(18,1))
INSERT INTO @SAMPLEDATA VALUES
('m0001', '03/27/2017', 8),
('m0001', '03/28/2017', 3.5),
('m0002', '03/28/2017', 8),
('m0003', '03/26/2017', 12),
('M0001', '03/27/2017', 2)
SELECT ID,ISNULL([03/26/2017],0)[03/26/2017],ISNULL([03/27/2017],0) [03/27/2017],ISNULL([03/28/2017],0)[03/28/2017] FROM
(
SELECT ID,NLV,SGLV FROM @SAMPLEDATA
)T
PIVOT
(
SUM(SGLV) FOR NLV IN([03/26/2017],[03/27/2017],[03/28/2017])
)PIV;
output
------------------------------------------
--ID 03/26/2017 03/27/2017 03/28/2017
------------------------------------------
m0001 0.0 10.0 3.5
m0002 0.0 0.0 8.0
m0003 12.0 0.0 0.0
------------------------------------------
USING DYNAMIC QUERY : As mentioned in comments, if output is required to be generated for current complete month then the same can be achieved using dynamic query also rather than writing CASE for each and every day of month. Try below query:
DECLARE @DYNAMICQUERY NVARCHAR(MAX)=''
DECLARE @DATERANGE VARCHAR(MAX)=''
;WITH COMPLETEMONTH (COL)
AS
(
SELECT CAST(CAST(MONTH(CURRENT_TIMESTAMP) AS VARCHAR(2))+'/'+'01/'+CAST(YEAR(CURRENT_TIMESTAMP) AS VARCHAR(4)) AS DATETIME)
UNION ALL
SELECT DATEADD(D,1,COL)COL FROM COMPLETEMONTH
WHERE COL< DATEADD(D,-1, (DATEADD(M,1,CAST(CAST(MONTH(CURRENT_TIMESTAMP) AS VARCHAR(2))+'/'+'01/'+CAST(YEAR(CURRENT_TIMESTAMP) AS VARCHAR(4)) AS DATETIME))))
)
SELECT @DATERANGE=@DATERANGE+'['+CONVERT(VARCHAR,COL,101)+']'+',' FROM COMPLETEMONTH
SET @DATERANGE=LEFT(@DATERANGE,LEN(@DATERANGE)-1)
SELECT @DYNAMICQUERY=
'SELECT ID,'+@DATERANGE+' FROM
(
SELECT ''m0001'' ID , ''03/27/2017'' NLV, 8 SGLV
UNION ALL
SELECT ''m0001'', ''03/28/2017'', 3.5
UNION ALL
SELECT ''m0002'', ''03/28/2017'', 8
UNION ALL
SELECT ''m0003'', ''03/26/2017'', 12
UNION ALL
SELECT ''M0001'', ''03/27/2017'', 2
)T
PIVOT
(
SUM(SGLV) FOR NLV IN('+@DATERANGE+')
)PIV;'
EXEC SP_EXECUTESQL @DYNAMICQUERY,N'@DATERANGE VARCHAR(MAX)',@DATERANGE=@DATERANGE
Upvotes: 1
Reputation: 901
Try this it may help you
select * into #temp from (
select 'm0001'ID, '27/03/2017' as NLV ,8 SGLV
union all
select 'm0001', '28/03/2017', 3.5
union all
select 'm0002 ', '28/03/2017' , 8
union all
select 'm0003 ','26/03/2017' ,12
union all
select 'M0001 ','27/03/2017' , 2
) as a
;with cte as (
select ID,isnull([27/03/2017],0)as [27/03/2017],isnull([28/03/2017],0)as [28/03/2017],isnull([26/03/2017],0) as [26/03/2017] from(
select * from #temp
) as a
pivot
(
max(sglv) for nlv in ([27/03/2017],[28/03/2017],[26/03/2017])
)
as a
)
select id,[27/03/2017]+[28/03/2017]+[26/03/2017] as SUM_SGLV,[27/03/2017],[28/03/2017],[26/03/2017] from cte
Upvotes: 1
Reputation: 5893
CREATE TABLE #Table1
([ID] varchar(5), [NLV] varchar(10), [SGLV] float)
;
INSERT INTO #Table1
([ID], [NLV], [SGLV])
VALUES
('m0001', '27/03/2017', 8),
('m0001', '28/03/2017', 3.5),
('m0002', '28/03/2017', 8),
('m0003', '26/03/2017', 12),
('M0001', '27/03/2017', 2)
;
SELECT ID,ISNULL([26/03/2017],0)+ISNULL([27/03/2017],0)+ISNULL([28/03/2017],0) AS [SUM(DGLV)],
ISNULL([26/03/2017],0)'26 (26/03/2017)',ISNULL([27/03/2017],0)'27 (27/03/2017)',ISNULL([28/03/2017],0)'28 (28/03/2017)'
FROM
(
SELECT *
FROM #TABLE1
) SRC
PIVOT
(
SUM(SGLV)
FOR NLV IN ([26/03/2017], [27/03/2017],[28/03/2017])
) PIV;
Upvotes: 1