how to set space between two pivot column - sql

query pivot with two word with space in column
DECLARE #cols NVARCHAR(MAX) SELECT
top 24 #cols = COALESCE(#cols + ',[' + CONVERT(varchar, DateIn ,21 ) + ']','[' + CONVERT(varchar, DateIn ,21) + ']' )
FROM DailyAttendanceMaster where DateIn between '2018-10-01 00:00:00.000' and '2018-10-24 00:00:00.000'
DECLARE #qry NVARCHAR(4000) SET
#qry = 'SELECT * FROM (SELECT Employee_Master.Employee_Name, convert(char(5), TimeIn, 108)+ + convert(char(5), TimeOutD, 108)TimeIn , DailyAttendanceMaster.DateIn FROM DailyAttendanceMaster inner join Employee_Master on Employee_Master.essl_EmpID=DailyAttendanceMaster.EMPID)emp
PIVOT (MAX(TimeIn) FOR DateIn IN (' + #cols + ')) AS stat'
EXEC(#qry)
here is my pivot query i am concatenate two column that is TimeIn and TimeOutD it work correct but i want sapce between two column so how can i do it
enter image description here

Related

Dynamic Multi Pivot in SQL Server

I am new to SQL Server Pivot. I have an input table with data represented like the below. It has model data with three amount columns. The amounts are applicable for those models based on the date provided.
I am trying to generate a report like the below in a dynamic fashion where distinct number of dates along with three amounts should be displayed in the report for each model.
I have tried a Dynamic SQL like the below.
SELECT #pivotcols = STUFF((
SELECT ',' + QUOTENAME(DATE)
FROM #table
GROUP BY Date
ORDER BY Date
FOR XML PATH('')
,TYPE
).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
SET #query = N'SELECT Model,' + #pivotcols + N' from
(
SELECT Model
,Amount1
,Amount2
,Amount3
,[DATE] AS DATE1
,[DATE] AS DATE2
,[DATE] AS DATE3
FROM #table
) x
pivot
(
max(amount1)
for Date1 in (' + #pivotcols + N')
) r
pivot
(
max(amount2)
for Date2 in (' + #pivotcols + N')
) p
pivot
(
max(amount3)
for Date3 in (' + #pivotcols + N')
) o '
EXEC sp_executesql #query;
When I try with this query I am getting the following error.
The column name "2000-01-01" specified in the PIVOT operator conflicts with the existing column name in the PIVOT argument.
Kindly show some light on this.
Finally I achieved the results using the below query
DECLARE #selectcols AS NVARCHAR(MAX) = ''
,#pivotcols AS NVARCHAR(MAX) = ''
,#query AS NVARCHAR(MAX) = ''
SELECT #selectcols = STUFF((
SELECT ',[AMT1-' + convert(VARCHAR(10), [DATE], 101) + ']'
+ ',[AMT2-' + convert(VARCHAR(10), [DATE], 101) + ']'
+ ',[AMT3-' + convert(VARCHAR(10), [DATE], 101) + ']'
+ ',[TOT-' + convert(VARCHAR(10), [DATE], 101) + ']'
FROM #table
GROUP BY [DATE]
ORDER BY [DATE]
FOR XML PATH('')
,TYPE
).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
SELECT #pivotcols = STUFF((
SELECT ',[AMT1-' + convert(VARCHAR(10), [DATE], 101) + ']'
FROM #table
GROUP BY [DATE]
ORDER BY [DATE]
FOR XML PATH('')
,TYPE
).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
SET #query = N'SELECT [Model],' + #selectcols + N' from
(
select [Model],AMT1,AMT2,AMT3,AMT1+AMT2+AMT3 AS TOT
,''AMT1-'' + convert(VARCHAR(10), [DATE], 101) as DATE1
,''AMT2-'' + convert(VARCHAR(10), [DATE], 101) as DATE2
,''AMT3-'' + convert(VARCHAR(10), [DATE], 101) as DATE3
,''TOT-'' + convert(VARCHAR(10), [DATE], 101) as DATE4
from #table
) x
pivot
(
max(AMT1)
for DATE1 in (' + #pivotcols + N')
) r
pivot
(
max(AMT2)
for DATE2 in (' + replace(#pivotcols,'AMT1','AMT2') + N')
) p
pivot
(
max(AMT3)
for DATE3 in (' + replace(#pivotcols,'AMT1','AMT3') + N')
) o
pivot
(
max(TOT)
for DATE4 in (' + replace(#pivotcols,'AMT1','TOT') + N')
) t'
EXEC sp_executesql #query;

Must declare the scalar variable pivot sql query

i am generating attendance report by pivot SQL on the basis of data thought thumb impression but the query shows error
Must declare the scalar variable "#abc".
here is my query
DECLARE #cols NVARCHAR(MAX)
DECLARE #abc NVARCHAR(MAX)
set #abc='00:00'
SELECT
top 1 #cols = COALESCE(#cols + ',[' + CONVERT(varchar, DateIn ,106 )
+ ']','[' + CONVERT(varchar, DateIn ,106) + ']' )
FROM DailyAttendanceMaster where
DateIn between '2019-01-01 00:00:00.000' and '2019-01-01 00:00:00.000'
group by DateIn order by DateIn asc
DECLARE #qry NVARCHAR(4000) SET
#qry = 'SELECT * FROM (SELECT Employee_Master.Employee_Name,
case when convert(char(5), TimeIn, 108)= convert(char(5), #abc, 108) then "A"
else "B"
end "TimeIn" ,
DailyAttendanceMaster.DateIn FROM DailyAttendanceMaster inner
join Employee_Master on Employee_Master.essl_EmpID=DailyAttendanceMaster.EMPID)emp
PIVOT (MAX(TimeIn) FOR DateIn IN (' + #cols + ')) AS stat'
EXEC(#qry)
You need to pass variable:
EXEC sp_executesql #qry, N'#abc NVARCHAR(MAX)', #abc

Operand type clash: date is incompatible with int While selecting rows

ALTER PROCEDURE [dbo].[Expense_monthly_report] #start_date VARCHAR(100),
#end_date VARCHAR(100)
AS
BEGIN
DECLARE #SQLQuery AS NVARCHAR(max)
DECLARE #PivotColumns AS NVARCHAR(max)
SET nocount ON;
SELECT #PivotColumns = COALESCE(#PivotColumns + ',', '')
+ Quotename( date_of_expp)
FROM (SELECT DISTINCT Month(date_of_exp) AS date_of_expp
FROM [dbo].[tbl_exp_details]
WHERE date_of_exp >= #start_date
AND date_of_exp <= #end_date) AS PivotExample
SET #SQLQuery = N'SELECT p.part_id,' + #PivotColumns
+ ',total_amount FROM (SELECT part_id,month(date_of_exp) as month_of_exp,exp_amount FROM [dbo].[tbl_exp_details]) as tbl PIVOT( sum(exp_amount) FOR month_of_exp IN ('
+ #PivotColumns
+ ')) AS P join (SELECT part_id,sum(exp_amount) as total_amount FROM [dbo].[tbl_exp_details] where date_of_exp>='
+ #start_date + ' and date_of_exp<=' + #end_date
+ ' group by part_id) as la on p.part_id=la.part_id'
EXEC Sp_executesql #SQLQuery
END
I am getting error
date incompatible with int
. Help me to find out the problem.
You have not delimited the date values in the dynamic query.
So
date_of_exp<=' + #end_date
becomes
date_of_exp<= 2017-07-19
which evaluates to this, and int won't implicitly convert to date
date_of_exp <= 1991
The correct way to use Sp_executesql and fix this is:
SET #SQLQuery = N'SELECT p.part_id,' + #PivotColumns
+ ',total_amount FROM (SELECT part_id,month(date_of_exp) as month_of_exp,exp_amount FROM [dbo].[tbl_exp_details]) as tbl PIVOT( sum(exp_amount) FOR month_of_exp IN ('
+ #PivotColumns
+ ')) AS P join (SELECT part_id,sum(exp_amount) as total_amount FROM [dbo].[tbl_exp_details] where date_of_exp>= #start_date and date_of_exp<=#end_date '
+ ' group by part_id) as la on p.part_id=la.part_id'
EXEC Sp_executesql #SQLQuery,
N'#start_date date, #end_date date',
#start_date,
#end_date

PIVOT and TEMP TABLE

please can you help me put this script into a temp table. i have been working on this for hours and it keeps giving me errors.
DECLARE #PivotColumnHeaders VARCHAR(MAX)
SELECT #PivotColumnHeaders =
COALESCE(#PivotColumnHeaders + ',[' + CAST(expansion as varchar(max)) + ']',
'[' + CAST(expansio
n as varchar(max))+ ']')
INTO #temp
FROM (Select distinct expansion from #CD4_VL2) results
DECLARE #PivotTableSQL NVARCHAR(MAX)
SET #PivotTableSQL = N'
select * from
(
select subjectID,expansion,printableValue1
from #CD4_VL2) as results
PIVOT
(MAX([printableValue1])
FOR [expansion] IN (
' + #PivotColumnHeaders + '
)
) as PivotTable
--order by Performed_Date_And_Time desc
'
Execute(#PivotTableSQL )
Because you've pivoted on the expansion columns, the respective values of MAX(printableValue1) will now be in columns with the names of the data in the Expansion column. Change this like so:
DECLARE #PivotColumnHeaders NVARCHAR(MAX) = 'Expansion1, Expansion2, Expansion3';
DECLARE #PivotTableSQL NVARCHAR(MAX);
SET #PivotTableSQL =
N'select subjectID, ' + #PivotColumnHeaders
+' from #CD4_VL2
PIVOT
(
MAX([printableValue1])
FOR [expansion] IN (' + #PivotColumnHeaders + ')) x';
Execute(#PivotTableSQL);
SqlFiddle here

Rows To Columns in SQL SERVER USING PIVOT Command (Replacing NULL Values To 0 & Display SUM Of ALL VALUES)

I want to display rows to columns in Sql Server. I have seen the other questions but those columns are hardcoded in the pivot but my columns will be dynamic. What I have achieved till now. As shown in the screenshot I am able to convert the rows into columns but few things I am not able to accomplish.. Need your guyz help
Replacing NULL To 0 in All the Columns
Need to Add 1 more column which will show the sum of all Columns except the companyID
My SQL code:
DECLARE #Columns VARCHAR(MAX)
DECLARE #Convert VARCHAR(MAX)
SELECT #Columns = STUFF((
SELECT '],[' + ErrClassfn
from ArchimedesTables.dbo.PM_ErrClassificationSetup
WHERE CONVERT(VARCHAR(10), ISNULL(EndDate, GETDATE()), 101)
Between CONVERT(VARCHAR(10), GETDATE(), 101)
AND CONVERT(VARCHAR(10), GETDATE(), 101)
ORDER BY '],[' + CONVERT(VARCHAR(MAX), ID) ASC
FOR
XML PATH('')
), 1, 2, '') + ']'
SET #Convert = 'SELECT * INTO #mynewTable FROM
(
SELECT COUNT(WQ.ErrClassfnID) as ErrorCount, UPPER(WQ.CompanyID) as CompanyID,
PME.ErrClassfn as ErrorName
FROM Version25.dbo.WF_Quality AS WQ
LEFT JOIN ArchimedesTables.dbo.PM_ErrClassificationSetup as PME
ON WQ.ErrClassfnID = PME.ID
GROUP BY
UPPER(CompanyID), ErrClassfn
) Quality PIVOT ( SUM(ErrorCount) For ErrorName IN (' + #Columns
+ ')) as PivotTable SeLeCt * FROM #mynewTable'
EXEC(#Convert)
You can alter the columns names, etc for a Dynamic Pivot, similar to this:
DECLARE #ColumnsNull VARCHAR(MAX)
DECLARE #Columns VARCHAR(MAX)
DECLARE #Convert VARCHAR(MAX)
SELECT #ColumnsNull = STUFF((SELECT ', IsNull(' + QUOTENAME(ErrClassfn) +', 0) as ['+ rtrim(ErrClassfn)+']'
from ArchimedesTables.dbo.PM_ErrClassificationSetup
WHERE CONVERT(VARCHAR(10), ISNULL(EndDate, GETDATE()), 101)
Between CONVERT(VARCHAR(10), GETDATE(), 101)
AND CONVERT(VARCHAR(10), GETDATE(), 101)
ORDER BY ID ASC
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
SELECT #Columns = STUFF((
SELECT '],[' + ErrClassfn
from ArchimedesTables.dbo.PM_ErrClassificationSetup
WHERE CONVERT(VARCHAR(10), ISNULL(EndDate, GETDATE()), 101)
Between CONVERT(VARCHAR(10), GETDATE(), 101)
AND CONVERT(VARCHAR(10), GETDATE(), 101)
ORDER BY '],[' + CONVERT(VARCHAR(MAX), ID) ASC
FOR
XML PATH('')
), 1, 2, '') + ']'
SET #Convert = 'SELECT CompanyID, '+ #ColumnsNull + '
INTO #mynewTable
FROM
(
SELECT COUNT(WQ.ErrClassfnID) as ErrorCount, UPPER(WQ.CompanyID) as CompanyID,
PME.ErrClassfn as ErrorName
FROM Version25.dbo.WF_Quality AS WQ
LEFT JOIN ArchimedesTables.dbo.PM_ErrClassificationSetup as PME
ON WQ.ErrClassfnID = PME.ID
GROUP BY
UPPER(CompanyID), ErrClassfn
) Quality PIVOT ( SUM(ErrorCount) For ErrorName IN (' + #Columns
+ ')) as PivotTable SeLeCt * FROM #mynewTable'
EXEC(#Convert)
I would advise to write the query and get the columns working first, then add the data to a #temp table. It will be easier to debug that way.
You can also create a SUM() field the same way, where you build it dynamically and then add it at in the final SELECT:
So it could be something like this that you could add to the final SELECT:
SELECT #ColumnsTotal = STUFF((SELECT '+' + QUOTENAME(ErrClassfn)
from ArchimedesTables.dbo.PM_ErrClassificationSetup
WHERE CONVERT(VARCHAR(10), ISNULL(EndDate, GETDATE()), 101)
Between CONVERT(VARCHAR(10), GETDATE(), 101)
AND CONVERT(VARCHAR(10), GETDATE(), 101)
ORDER BY ID ASC
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')