Sql 我需要动态地将查询结果按行排列成按列排列
我有三个表Sql 我需要动态地将查询结果按行排列成按列排列,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我有三个表country、countrycontent和language,每个表的create和insert语句显示在下面的脚本中(您可以通过执行下面的脚本直接创建和插入数据) 在所有表中插入数据 我需要查询/存储过程的输出,如下图所示: 我创建了存储过程,如下所示 在这里确保, 语言表中的语言数可能会增加 country in country表可能会增加 在这两种情况下,查询/存储过程都应正常工作,无需任何更改。 我的意思是查询/存储过程应该是动态的。您可以使用pivot操作符并将
country
、countrycontent
和language
,每个表的create和insert语句显示在下面的脚本中(您可以通过执行下面的脚本直接创建和插入数据)
在所有表中插入数据
我需要查询/存储过程的输出,如下图所示:
我创建了存储过程,如下所示
在这里确保, 语言表中的语言数可能会增加 country in country表可能会增加 在这两种情况下,查询/存储过程都应正常工作,无需任何更改。
我的意思是查询/存储过程应该是动态的。您可以使用pivot操作符并将查询编写为:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(name)
from [language]
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT countryid,' + @cols + '
from
(
select cc.countryid ,cc.name as countrycontentname, [language].name as languagename
from countrycontent cc
inner join [language] on cc.languageid = [language].id
) T
pivot
(
max (countrycontentname)
for languagename in (' + @cols + ')
) p '
execute sp_executesql @query;
您可以使用pivot运算符并按以下方式编写查询:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(name)
from [language]
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT countryid,' + @cols + '
from
(
select cc.countryid ,cc.name as countrycontentname, [language].name as languagename
from countrycontent cc
inner join [language] on cc.languageid = [language].id
) T
pivot
(
max (countrycontentname)
for languagename in (' + @cols + ')
) p '
execute sp_executesql @query;
巴维斯我想你想要这个
DECLARE @cols AS NVARCHAR(MAX),
@cols1 AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME(rtrim(ltrim(code)))
from [language] order by id
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
select @cols1 = STUFF((SELECT 'Isnull(' + QUOTENAME(rtrim(ltrim(code))) + ','''') as ' + QUOTENAME(rtrim(ltrim(code))) + ','
from [language] Order by id
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,0,'')
Set @cols1 = Left(@cols1 , LEN(@cols1) - 1)
set @query = 'SELECT countryid,' + @cols1 + '
from
(
select cc.countryid ,cc.name as countrycontentname, [language].code as languagename
from countrycontent cc
inner join [language] on cc.languageid = [language].id
) T
pivot
(
max (countrycontentname)
for languagename in (' + @cols + ')
) p '
execute sp_executesql @query;
巴维斯我想你想要这个
DECLARE @cols AS NVARCHAR(MAX),
@cols1 AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME(rtrim(ltrim(code)))
from [language] order by id
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
select @cols1 = STUFF((SELECT 'Isnull(' + QUOTENAME(rtrim(ltrim(code))) + ','''') as ' + QUOTENAME(rtrim(ltrim(code))) + ','
from [language] Order by id
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,0,'')
Set @cols1 = Left(@cols1 , LEN(@cols1) - 1)
set @query = 'SELECT countryid,' + @cols1 + '
from
(
select cc.countryid ,cc.name as countrycontentname, [language].code as languagename
from countrycontent cc
inner join [language] on cc.languageid = [language].id
) T
pivot
(
max (countrycontentname)
for languagename in (' + @cols + ')
) p '
execute sp_executesql @query;
看,我已经用我所做的更新了这个问题。@BhaveshKachhadiya也看到了这个答案。。。看,我已经用我所做的更新了这个问题。@BhaveshKachhadiya也看到了这个答案@Deepshikha您的代码工作正常,但是列的顺序不正确,列名应该是语言代码,我需要空单元格而不是
NULL
value。你能做到吗?@Deepshikha你的代码工作正常,但是列的顺序不正确,列名应该是语言代码,我需要空单元格而不是NULL
value。你能做到吗?这正是我需要的。。!这正是我需要的。。!
CREATE PROCEDURE GetCountryList
AS
BEGIN
SET NOCOUNT ON;
SELECT c.id AS countryid, l.code languagecode , cc.NAME
FROM country c
INNER JOIN countrycontent cc ON c.id= cc.countryid AND c.flagdeleted = 0 AND cc.flagdeleted =0
INNER JOIN [language] l ON l.id = cc.languageid AND l.flagdeleted =0
END
GO
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(name)
from [language]
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT countryid,' + @cols + '
from
(
select cc.countryid ,cc.name as countrycontentname, [language].name as languagename
from countrycontent cc
inner join [language] on cc.languageid = [language].id
) T
pivot
(
max (countrycontentname)
for languagename in (' + @cols + ')
) p '
execute sp_executesql @query;
DECLARE @cols AS NVARCHAR(MAX),
@cols1 AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME(rtrim(ltrim(code)))
from [language] order by id
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
select @cols1 = STUFF((SELECT 'Isnull(' + QUOTENAME(rtrim(ltrim(code))) + ','''') as ' + QUOTENAME(rtrim(ltrim(code))) + ','
from [language] Order by id
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,0,'')
Set @cols1 = Left(@cols1 , LEN(@cols1) - 1)
set @query = 'SELECT countryid,' + @cols1 + '
from
(
select cc.countryid ,cc.name as countrycontentname, [language].code as languagename
from countrycontent cc
inner join [language] on cc.languageid = [language].id
) T
pivot
(
max (countrycontentname)
for languagename in (' + @cols + ')
) p '
execute sp_executesql @query;