Stuff query in SQL Server - sql

SELECT DISTINCT
AcNumber,
(SELECT STUFF((SELECT '::' + (REPLACE(RTRIM(LTRIM([master].dbo.Mig_fn_cutString([master].dbo.Mig_fn_StringReduce(UPPER(NomiName)),35,',',1,'Y','F'))),',',' '))
FROM [DepNominee] DPN
WHERE (AcNumber = DPN.AcNumber)
FOR XML PATH(''), TYPE).value('(./text())[1]', 'VARCHAR(MAX)'), 1, 2, '')) AS JBL_NOM_NAME,
(SELECT STUFF((SELECT '::' + (REPLACE(RTRIM(LTRIM([master].dbo.Mig_fn_cutString([master].dbo.Mig_fn_StringReduce(UPPER(FHName)),35,',',1,'Y','F'))),',',' '))
FROM [DepNominee] DPN
WHERE (AcNumber = DPN.AcNumber)
FOR XML PATH(''),TYPE).value('(./text())[1]', 'VARCHAR(MAX)'), 1, 2, '')) AS NOM_FATH_NAME,
(SELECT STUFF((SELECT '::' + (REPLACE(RTRIM(LTRIM([master].dbo.Mig_fn_cutString([master].dbo.Mig_fn_StringReduce(UPPER(MHName)),35,',',1,'Y','F'))),',',' '))
FROM [DepNominee] DPN
--WHERE (AcNumber = DPN.AcNumber)
FOR XML PATH(''),TYPE).value('(./text())[1]', 'VARCHAR(MAX)'), 1, 2, '')) AS NOM_MOTH_NAME
FROM
[DepNominee] DPN
GROUP BY
AcNumber, NomiName
That is my code, I want to see all data according my AccountNumber. But I see only one data repeating all the time in different account number. I attach the image:

I suspect the problem is that you are using the alias DPN in more than one place, causing your subqueries not to be correlated.
Try it like this:
SELECT DISTINCT
AcNumber,
(SELECT STUFF((SELECT '::' + (REPLACE(RTRIM(LTRIM([master].dbo.Mig_fn_cutString([master].dbo.Mig_fn_StringReduce(UPPER(NomiName)),35,',',1,'Y','F'))),',',' '))
FROM [DepNominee] DPN2
WHERE (DPN.AcNumber = DPN2.AcNumber)
FOR XML PATH(''), TYPE).value('(./text())[1]', 'VARCHAR(MAX)'), 1, 2, '')) AS JBL_NOM_NAME,
(SELECT STUFF((SELECT '::' + (REPLACE(RTRIM(LTRIM([master].dbo.Mig_fn_cutString([master].dbo.Mig_fn_StringReduce(UPPER(FHName)),35,',',1,'Y','F'))),',',' '))
FROM [DepNominee] DPN2
WHERE (DPN.AcNumber = DPN2.AcNumber)
FOR XML PATH(''),TYPE).value('(./text())[1]', 'VARCHAR(MAX)'), 1, 2, '')) AS NOM_FATH_NAME,
(SELECT STUFF((SELECT '::' + (REPLACE(RTRIM(LTRIM([master].dbo.Mig_fn_cutString([master].dbo.Mig_fn_StringReduce(UPPER(MHName)),35,',',1,'Y','F'))),',',' '))
FROM [DepNominee] DPN2
--WHERE (DPN.AcNumber = DPN2.AcNumber)
FOR XML PATH(''),TYPE).value('(./text())[1]', 'VARCHAR(MAX)'), 1, 2, '')) AS NOM_MOTH_NAME
FROM
[DepNominee] DPN
GROUP BY
AcNumber, NomiName

Related

how to insert a line break after every second loop in t-sql stuff function

how can i insert a CHAR(10) after every second loop in t-sql stuff function in my query
SELECT STUFF(
(
SELECT ', ' + new_name
FROM new_subcatagories
FOR XML PATH(''), TYPE
).value('.', 'VARCHAR(MAX)'), 1, 2, '')
so the result should by
record1,record2,
record3,record4
You could use a CASE expression to see if the value of ROW_NUMBER is divisible by 2, and if not then add a carriage return and line break:
SELECT STUFF((SELECT CASE WHEN ROW_NUMBER() OVER (order by new_nam) % 2 = 1 THEN CHAR(13) + CHAR(10) ELSE '' END + ', ' + new_nam
FROM new_subcatagories
ORDER BY new_nam
FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'), 1, 4, '');

Not able to create UNIQUE CLUSTERED INDEX on View WITH SCHEMABINDING having sub queries

Below is the code:
CREATE VIEW [dbo].[View_GetAllContents] WITH SCHEMABINDING AS
SELECT C.ContentID,
C.Title,
C.[Description],
C.Tags,
C.Markets,
C.Formats,
C.Categories,
C.IsGlobalSalesResource,
C.IsActive,
C.CreatedBy,
C.CreatedDate,
C.ModifiedBy,
STUFF(
(SELECT ',' + T.TagName
FROM [dbo].[Tags] T
WHERE T.IsActive=1
AND T.TagID IN
(SELECT LTRIM(RTRIM(items))
FROM [dbo].[SplitString](C.Tags, ','))
FOR XML PATH(''), TYPE).value('.[1]', 'nvarchar(max)'), 1, 2, '') AS TagNames,
STUFF(
(SELECT ',' + M.MarketName
FROM [dbo].[Markets] M
WHERE M.IsActive=1
AND M.MarketID IN
(SELECT LTRIM(RTRIM(items))
FROM [dbo].[SplitString](C.Markets, ','))
FOR XML PATH(''), TYPE).value('.[1]', 'nvarchar(max)'), 1, 2, '') AS MarketNames,
STUFF(
(SELECT ',' + F.FormatName
FROM [dbo].[Formats] F
WHERE F.IsActive=1
AND F.FormatID IN
(SELECT LTRIM(RTRIM(items))
FROM [dbo].[SplitString](C.Formats, ','))
FOR XML PATH(''), TYPE).value('.[1]', 'nvarchar(max)'), 1, 2, '') AS FormatNames,
STUFF(
(SELECT ',' + Ca.CategoryName
FROM [dbo].[Categories] Ca
WHERE Ca.IsActive=1
AND Ca.CategoryID IN
(SELECT LTRIM(RTRIM(items))
FROM [dbo].[SplitString](C.Categories, ','))
FOR XML PATH(''), TYPE).value('.[1]', 'nvarchar(max)'), 1, 2, '') AS CategorieNames,
STUFF(
(SELECT '$A$' + cast(A.AttachmentID AS varchar) + '$,$' + cast(A.ActualFileName AS nvarchar(1000))
FROM [dbo].[Attachments] A
WHERE A.ContentID=C.ContentID
FOR XML PATH(''), TYPE).value('.[1]', 'nvarchar(max)'), 1, 3, '') AS Attachments
FROM [dbo].[Contents] C GO
Error on below code:
CREATE UNIQUE CLUSTERED INDEX [IX_View_GetAllContents_ContentID] ON [dbo].[View_GetAllContents](ContentID);
GO
Exception:
Cannot create index on view "SM_SalesWarehouse.dbo.View_GetAllContents" because it contains one or more subqueries. Consider changing the view to use only joins instead of subqueries. Alternatively, consider not indexing this view.

& instead of & in STUFF FOR XML PATH

I am using STUFF function. I have some entries having & but shows &amp ; instead. Somewhere I read that & is reserved in XML. How to solve this.
...STUFF((SELECT (', ' + CategoryName) FROM CategoryTable WHERE CategoryId IS NOT NULL AND CategoryId IN (1,2,3) FOR XML PATH('')), 1, 1, '') as CategoryName,...
Above is my query (Well I have just added a part of a full query.). How to solve. Thanks.
The wrong way:
SELECT STUFF(
(
SELECT ', ' + v.name
FROM (
VALUES
('bonnie & clyde'),
('thelma & louise')
)v(NAME)
FOR XML PATH('')
), 1, 2, '')
The jedi path:
SELECT STUFF(
(
SELECT ', ' + v.name
FROM (
VALUES
('bonnie & clyde'),
('thelma & louise')
)v(NAME)
FOR XML PATH(''), TYPE
).value('.', 'VARCHAR(MAX)'), 1, 2, '')
Use this ..
FOR XML PATH(''),TYPE).value('.','NVARCHAR(MAX)')

Select comma sperated column value

I'm trying to get comma , separated column value in SQL Server.
Select
CT.ClaimTypeId, CT.ClaimTypeName,CT.MHWSchemeNo,CT.MHWClaimTypeID,CFCTR.FormId,CF.Name,
FF.FormId,FF.FieldId,FF.Label,FF.Name,FF.IsDefaultField,FF.IsFieldLabelVisible,FF.IsRequired,FF.Type,
Label = STUFF((
SELECT ',' +JFFO.Label
FROM dbo.FormFieldOption JFFO
where JFFO.FieldId = FF.FieldId
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, ''),
Value= STUFF((
SELECT ',' +JFFO.Value
FROM dbo.FormFieldOption JFFO
where JFFO.FieldId = FF.FieldId
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, ''),
AdditionalTextfieldName= STUFF((
SELECT ',' +JFFO.AdditionalTextfieldName
FROM dbo.FormFieldOption JFFO
where JFFO.FieldId = FF.FieldId
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
from EmployeeClaimTypeRelationship ECR
LEFT JOIN ClaimType CT on CT.MHWSchemeNo=ECR.MHWSchemeNo
LEFT JOIN ClaimFormClaimTypeRelationship CFCTR on CFCTR.ClaimTypeId=CT.ClaimTypeId
LEFT JOIN ClaimForm CF on CF.FormId=CFCTR.FormId
LEFT JOIN FormField FF on FF.FormId=CFCTR.FormId
LEFT JOIN FormFieldOption FFO on FFO.FieldId=FF.FieldId
where ECR.MHWUserId='CITITEST1'
group by FF.FieldId,CT.ClaimTypeId, CT.ClaimTypeName,CT.MHWSchemeNo,CT.MHWClaimTypeID,CFCTR.FormId,CF.Name,
FF.FormId,FF.FieldId,FF.Label,FF.Name,FF.IsDefaultField,FF.IsFieldLabelVisible,FF.IsRequired,FF.Type
This is my query. And it is giving me the correct result. Here I'm using group by clause.
Now I want to optimize this query.
As you can see above, I have 3 columns which have comma , separated values which are coming from same table.
Is there any way so that I don't have to write multiple time same query for different fields?
Like this
Select
CT.ClaimTypeId, CT.ClaimTypeName,CT.MHWSchemeNo,CT.MHWClaimTypeID,CFCTR.FormId,CF.Name,
FF.FormId,FF.FieldId,FF.Label,FF.Name,FF.IsDefaultField,FF.IsFieldLabelVisible,FF.IsRequired,FF.Type,
Label = STUFF((
SELECT ',' +JFFO.Label
FROM dbo.FormFieldOption JFFO
where JFFO.FieldId = FF.FieldId
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, ''),
Value,AdditionalTextfieldName = STUFF((
SELECT ',' +JFFO.Value as Value,','+JFFO.AdditionalTextfieldName as AdditionalTextfieldName
FROM dbo.FormFieldOption JFFO
where JFFO.FieldId = FF.FieldId
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
from EmployeeClaimTypeRelationship ECR
LEFT JOIN ClaimType CT on CT.MHWSchemeNo=ECR.MHWSchemeNo
LEFT JOIN ClaimFormClaimTypeRelationship CFCTR on CFCTR.ClaimTypeId=CT.ClaimTypeId
LEFT JOIN ClaimForm CF on CF.FormId=CFCTR.FormId
LEFT JOIN FormField FF on FF.FormId=CFCTR.FormId
LEFT JOIN FormFieldOption FFO on FFO.FieldId=FF.FieldId
where ECR.MHWUserId='CITITEST1'
group by FF.FieldId,CT.ClaimTypeId, CT.ClaimTypeName,CT.MHWSchemeNo,CT.MHWClaimTypeID,CFCTR.FormId,CF.Name,
FF.FormId,FF.FieldId,FF.Label,FF.Name,FF.IsDefaultField,FF.IsFieldLabelVisible,FF.IsRequired,FF.Type
You could have a view.
CREATE VIEW view_name AS
SELECT * FROM ... WHERE ...
(Instead of *, you might prefer to select the union of all columns you ever might need and possibly give them aliases.) Then you would only need to
SELECT column1, column2, column3
FROM view_name
WHERE [additional conditions]
I would create a UDF Table-Valued Function and call that, it will also give you some performance benefit
Function Definition
CREATE FUNCTION dbo.fn_FormFieldOptionList ( #FieldId INT)
RETURNS TABLE
AS
RETURN (
SELECT DISTINCT
Label = STUFF((
SELECT ',' +JFFO.Label
FROM dbo.FormFieldOption JFFO
where JFFO.FieldId = FF.FieldId
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
,Value= STUFF((
SELECT ',' +JFFO.Value
FROM dbo.FormFieldOption JFFO
where JFFO.FieldId = FF.FieldId
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
,AdditionalTextfieldName= STUFF((
SELECT ',' +JFFO.AdditionalTextfieldName
FROM dbo.FormFieldOption JFFO
where JFFO.FieldId = FF.FieldId
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
FROM dbo.FormFieldOption FF
WHERE FF.FieldId = #FieldId )
Your Query
Select
CT.ClaimTypeId, CT.ClaimTypeName,CT.MHWSchemeNo
,CT.MHWClaimTypeID,CFCTR.FormId,CF.Name
,FF.FormId,FF.FieldId,FF.Label,FF.Name
,FF.IsDefaultField,FF.IsFieldLabelVisible
,FF.IsRequired,FF.Type,f.Label. f.Value ,f.AdditionalTextfieldName
from EmployeeClaimTypeRelationship ECR
LEFT JOIN ClaimType CT on CT.MHWSchemeNo=ECR.MHWSchemeNo
LEFT JOIN ClaimFormClaimTypeRelationship CFCTR on CFCTR.ClaimTypeId=CT.ClaimTypeId
LEFT JOIN ClaimForm CF on CF.FormId=CFCTR.FormId
LEFT JOIN FormField FF on FF.FormId=CFCTR.FormId
OUTER APPLY dbo.fn_FormFieldOptionList(FF.FieldId) f
where ECR.MHWUserId='CITITEST1'
Here in this query, we are joining dbo.FormFieldOption twice. Good optimization & speed can be achieved if we can restructure the query. Try to restructure the join
towards table dbo.FormFieldOption to single.

sql server comma delimted string values into one row

I have a query that returns a row of multiple Itemcodes. The result is
Date group list of item code
2015-04-15 118 FYCT-00063,FYCM-00016,FYCM-00064,FYCF-00018
it's working fine but i need the result like this, with quotes around every code 'FYCT-00063','FYCM-00016','FYCM-00064','FYCF-00018'
The query is this:
SELECT DISTINCT SS.PostDate,SS.U_Unit,STUFF((
SELECT ', ',+ CAST(OWOR.ItemCode AS VARCHAR(10)) [text()]
FROM OWOR
WHERE OWOR.PostDate=SS.PostDate AND OWOR.U_Unit=SS.U_Unit AND OWOR.Status=SS.Status
FOR XML PATH('') , TYPE)
.value('.','NVARCHAR(MAX)'),1,2,' ') LISTGroup
from owor SS
Where SS.PostDate='15.APRIL.15' AND SS.U_Unit='Unit No 2' and SS.Status!='C'
SELECT DISTINCT SS.PostDate,SS.U_Unit,
STUFF((
SELECT ', ',+ '''' + CAST(OWOR.ItemCode AS VARCHAR(10) + '''') [text()]
FROM OWOR
WHERE OWOR.PostDate=SS.PostDate
AND OWOR.U_Unit=SS.U_Unit
AND OWOR.Status=SS.Status
FOR XML PATH('') , TYPE) .value('.','NVARCHAR(MAX)'),1,2,' ') LISTGroup
FROM owor SS
WHERE SS.PostDate='15.APRIL.15'
AND SS.U_Unit='Unit No 2'
AND SS.Status!='C'
Try this
SELECT DISTINCT SS.PostDate
,SS.U_Unit
,STUFF((
SELECT ', '
+ QUOTENAME(CAST(OWOR.ItemCode AS VARCHAR(10), ''''))
FROM OWOR
WHERE OWOR.PostDate = SS.PostDate
AND OWOR.U_Unit = SS.U_Unit
AND OWOR.STATUS = SS.STATUS
FOR XML PATH('')
).value('.', 'NVARCHAR(MAX)'), 1, 2, ' ') LISTGroup
FROM owor SS
WHERE SS.PostDate = '15.APRIL.15'
AND SS.U_Unit = 'Unit No 2'
AND SS.STATUS != 'C'
Try like this:
DECLARE #STRING varchar(max)
SELECT #STRING = 'FYCT-00063,FYCM-00016,FYCM-00064,FYCF-00018'
SELECT '''' + REPLACE(#STRING,',',''',''') + ''''
SQLFIDDLE DEMO
In your case it would be like
select distinct SS.PostDate,SS.U_Unit,'''' + REPLACE(STUFF((
SELECT ', ',+ CAST(OWOR.ItemCode AS VARCHAR(10)) [text()]
FROM OWOR
where OWOR.PostDate=SS.PostDate AND OWOR.U_Unit=SS.U_Unit AND OWOR.Status=SS.Status
FOR XML PATH('') , TYPE)
.value('.','NVARCHAR(MAX)'),1,2,' '),',',''',''') + '''' LISTGroup
from owor SS
Where SS.PostDate='15.APRIL.15' AND SS.U_Unit='Unit No 2' and SS.Status!='C'