Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 我需要动态地将查询结果按行排列成按列排列_Sql_Sql Server_Stored Procedures - Fatal编程技术网

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;