SQL Server Rows to Columns using subquery - sql

I tried to get rows into column using comma delimeted using this but how to achieve this using subquery, I achived that in oracle.
SQL Server :
DECLARE #listStr VARCHAR(MAX)
SELECT #listStr = COALESCE(#listStr+',' ,'') + email
FROM RDT_USER
SELECT #listStr
Oracle :
SELECT RTRIM(XMLAGG(XMLELEMENT(E, EMAIL || ',')).EXTRACT('//text()'), ',') AS RECEIVERID
FROM (SELECT DISTINCT (EMAIL) AS EMAIL
FROM RDT_USER
)
OUTPUT Expected :
j1#gmail.com,j2#gmail.com,j3#gmail.com,j4#gmail.com

You can use this:
DECLARE #listStr VARCHAR(MAX) =
STUFF(
(
SELECT DISTINCT ',' + email
FROM RDT_USER
FOR XML PATH(''), TYPE
).value('.', 'VARCHAR(MAX)')
,1,1,'')
SELECT #listStr
If you just want to select without variables, this should work:
SELECT
STUFF(
(
SELECT DISTINCT ',' + email
FROM RDT_USER
FOR XML PATH(''), TYPE
).value('.', 'VARCHAR(MAX)')
,1,1,'')

Related

Display Alias name for each column in dynamic query SQL Server

I have below table.
create table demo(id int, dataval varchar(50))
insert into demo
select 1, 'val'
union
select 2, 'val1'
union
select 3, 'val3'
I am trying to get the list of values of dataval column surrounded with max() in a variable using below query
DECLARE #maxcols AS NVARCHAR(MAX)
SELECT #maxcols = STUFF((SELECT DISTINCT ',' + 'MAX('+QUOTENAME([dataval] ) + ') AS [val]'
FROM demo
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
SELECT #maxcols AS val
I am getting below values.
max([val])as [val],max([val1])as [val],max([val3])as [val]
Here the alias name coming as static value [val]. I need the alias name displayed as column values.
Expected output:
max([val])as [val1],max([val1])as [val2],max([val3])as [val3]
Could someone help on this?
You can use row_Number as below:
DECLARE
#maxcols AS NVARCHAR(MAX)
select #maxcols = STUFF((SELECT distinct ',' + 'max('+QUOTENAME([dataval] )+')as [val'+ convert(varchar(10), Row_Number() over (order by (SELECT NULL))) + ']'
from demo
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
select #maxcols as val
Output as below:
+---------------------------------------------------------------+
| val |
+---------------------------------------------------------------+
| max([val])as [val1],max([val1])as [val2],max([val3])as [val3] |
+---------------------------------------------------------------+

How can I get a SQL query result in CSV format?

I have an SQL query that returns some rows. How can I change it so that the output of the query is in CSV format?
I have found a way to make the result in XML format, but because of the nature of XML the result is too large to be useful.
The query is very large (and it's not really important), so I wont post it here. Here is a link to it.Link
I don't want the SQL query to save the result as a CSV file.
YES
try this
DECLARE #query nvarchar(max)
select #query = STUFF( (SELECT N',' + cast( id as nvarchar)
from TableX
--some WHERE clause here as well
FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'')
select #query
NO variable :
select STUFF( (SELECT N',' + cast( id as nvarchar)
from TableX
FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'')
Like this:
select field1
, '","'
, field2
, '","'
etc

pivot table sort datetime column

I have the following part of sql statement to pivot dynamic columns. The number of columns (ClosingDate) is variable :
select #cols = STUFF((SELECT distinct ',' + QUOTENAME(ClosingDate + '_'+ c.col)
from #TmpT
cross apply
(
select 'Cnt' col
union all
select 'TT'
) c
FOR XML PATH('') , TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
The problem is that ClosingDate columns get converted to varchar and they are ordered as varchar, not as date .
Is there a way to order by datetime ? Thanks!
You could try converting them to dates yourself first:
select #cols = STUFF((SELECT distinct ',' +
QUOTENAME(CONVERT(VARCHAR(8),ClosingDate,112) + '_'+ c.col)
from #TmpT
cross apply
(
select 'Cnt' col
union all
select 'TT'
) c
FOR XML PATH('') , TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')

Dynamic Query Restructuring for View

I have created a dynamic SQL query that I want to use as a view, however, the query is dependent on using 'DECLARE' statements. I have tried unsuccessfully to restructure it without the 'DECLARE' statements, but can't quite get it right. I am using SQL Server Express 2014 and would appreciate any and all help.
DECLARE #query nvarchar(MAX)
DECLARE #Name nvarchar(MAX)
select #Name = STUFF((SELECT distinct ',' + QUOTENAME(Name)
FROM [dbo].[ObjectView]
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
SET #query = ' SELECT * from
(
select *
from [dbo].[ObjectView]
)t
pivot (MAX(Value) for Name IN (' +#Name+ ')) AS PivotTable'
execute(#query)
You may have to play with the XML syntax. I'm pretty rusty.
create view viewname as
select * --< you really should call out the fields, here...
from(
select * --< ...and here.
from ObjectView
t
pivot( MAX( Value ) for Name in(
select distinct QUOTENAME( Name )
FROM ObjectView
FOR XML PATH )
) AS PivotTable

how to split and concatenate in sql server?

I am passing in a string into a stored procedure to be used in a select statement using dynamic sql:
#groups as nvarchar(1000) = 'group1,group10,group8'
I might just pass in string of numbers, eg, '1,2,3,4'
I want to split these values and then concatenate them so that they end up in the following manner :
'rmc.group1,rmc.group10,rmc.group8'
declare #groups nvarchar(1000) ='group1,group10,group8'
set #groups = 'rmc.' + replace(#groups, ',', ',rmc.')
select #groups
Result:
rmc.group1,rmc.group10,rmc.group8
Sql Fiddle Demo
Select Replace('group1,group10,group8','group','rmc.group')
Try this one -
DECLARE #groups nvarchar(1000) = 'group1,group10,group8'
SELECT STUFF((
SELECT ',rmc.' + t
FROM (
SELECT t = t.c.value('.', 'VARCHAR(50)')
FROM (
SELECT ID = CAST ('<t>' + REPLACE(#groups, ',', '</t><t>') + '</t>' AS XML)
) r
CROSS APPLY ID.nodes ('/t') t(c)
) t
FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'), 1,1, '')
Output -
------------------------------------
rmc.group1,rmc.group10,rmc.group8