简体   繁体   English

我需要将查询结果的按行数据安排动态地转换为按列结果

[英]I Need the row-wise data arrangment of query result into column-wise result dynamically

I have three tables country , countrycontent and language and the create and insert statements for each table is shown in following script (you can directly create and insert data by just executing following script) 我有三个表countrycountrycontentlanguage ,每个表的create和insert语句显示在以下脚本中(您可以通过执行以下脚本来直接创建和插入数据)

   CREATE TABLE [dbo].[country]([id] [int] IDENTITY(1,1) NOT NULL,  [flagdeleted] [bit] NULL,
     CONSTRAINT [PK_country] PRIMARY KEY CLUSTERED 
    ([id] ASC)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, 
    ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]) ON [PRIMARY];

CREATE TABLE [dbo].[language](
    [id] [int] IDENTITY(1,1) NOT NULL,[name] [nvarchar](100) NULL,
    [code] [nchar](10) NULL,[flagdeleted] [bit] NULL,
 CONSTRAINT [PK_language] PRIMARY KEY CLUSTERED 
([id] ASC)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, 

ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY];

 SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[countrycontent](
        [id] [int] IDENTITY(1,1) NOT NULL,[countryid] [int] NULL,
        [languageid] [int] NULL,[name] [nvarchar](250) NULL,[flagdeleted] [bit] NULL,
     CONSTRAINT [PK_countrycontent] PRIMARY KEY CLUSTERED 
    ([id] ASC)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, 

    ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]) ON [PRIMARY]
    GO
    ALTER TABLE [dbo].[countrycontent]  WITH CHECK ADD  CONSTRAINT [FK_countrycontent_country] 

    FOREIGN KEY([countryid])
    REFERENCES [dbo].[country] ([id])
    GO
    ALTER TABLE [dbo].[countrycontent] CHECK CONSTRAINT [FK_countrycontent_country]
    GO
    ALTER TABLE [dbo].[countrycontent]  WITH CHECK ADD  CONSTRAINT [FK_countrycontent_language] 

    FOREIGN KEY([languageid])
    REFERENCES [dbo].[language] ([id])
    GO
    ALTER TABLE [dbo].[countrycontent] CHECK CONSTRAINT [FK_countrycontent_language]
    GO

Inserting data in all tables 在所有表中插入数据

 INSERT INTO country(flagdeleted) VALUES(0),(0),(0),(0),(0),(0),(0),(0);

INSERT INTO [language]([name],code,flagdeleted)
VALUES ('English','EN',0),
       ('Hindi','HI',0),('Polish','PO',0),
       ('Chinese','CH',0),('Russian','RU',0);

INSERT INTO countrycontent(countryid,languageid,flagdeleted,name) VALUES
(1,1,0,N'India'),(1,2,0,N'भारत'),(1,3,0,N'Indie'),(1,4,0,N'印度'),(1,5,0,N'Индия'),
(2,1,0,N'Australia'),(2,2,0,N'ऑस्ट्रेलिया'),(2,3,0,N'Australia'),(2,4,0,N'澳大利亚'),(2,5,0,N'Австралия'),
(3,1,0,N'China'),(3,2,0,N'चीन'),(3,3,0,N'Chiny'),(3,4,0,N'中国'),(3,5,0,N'Китай'),
(4,1,0,N'Canada'),(4,2,0,N'कनाडा'),(4,3,0,N'Kanada'),(4,4,0,N'加拿大'),(4,5,0,N'Канада'),
(5,1,0,N'Japan'),(5,2,0,N'जापान'),(5,3,0,N'Japonia'),(5,4,0,N'日本'),
(6,1,0,N'Russia'),(6,2,0,N'रूस'),(6,3,0,N'Rosja'),
(7,1,0,N'South Africa'),(7,2,0,N'दक्षिण अफ्रीका'),
 (8,1,0,N'United Kingdom'); 

I need Output of the Query/stored procedure as shown in below image: 我需要查询/存储过程的输出,如下图所示: 查询结果图


I have created the stored procedure as follow. 我创建了以下存储过程。


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

Here make sure that, the no. 在这里,请确保没有。 of languages in languages table may increase the country in country table may increase 语言表中语言的数量可能会增加国家表中的国家可能会增加

In both case the Query/stored procedure should work properly without any changes. 在两种情况下,查询/存储过程都应该可以正常运行,而无需进行任何更改。 I mean Query/stored procedure should dynamic. 我的意思是查询/存储过程应该是动态的。

You can use pivot operator and write a query as: 您可以使用数据透视运算符并将查询编写为:

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;

Bhavesh I think you want this Bhavesh我想你想要这个

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;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM