只有两列的 SQL Pivot

标签 sql sql-server tsql pivot

我正在尝试在具有两行的表上执行 PIVOT,如下所示:

Category       |   Sector
---------------------------
Bulbs          |   DIY
Bulbs          |   Home
Picnic blanket |   DIY
Picnic blanket |   Home
Picnic blanket |   Interior

每个类别可以有 1 个或多个扇区。

我正在尝试获得这样的表格:

Category       | Sector 1  | Sector 2  | Sector 3
-------------------------------------------------
Bulbs          | DIY       | Home      | NULL
Picnic blanket | DIY       | Home      | Interior

查询看起来像这样:

SELECT
    dbo.fn_DbContent_GetTranslation(pt.Name_DbContentId, 2) 'Category'
    , dbo.fn_DbContent_GetTranslation(s.Name_DbContentId, 2) 'Sector'
FROM dbo.ProductType pt
JOIN dbo.ProductTypeMandator ptm ON ptm.ProductTypeId = pt.Id
JOIN dbo.ProductTypeMandator2PortalSector ptmps ON ptmps.ProductTypeMandatorId = ptm.Id
JOIN dbo.PortalSector ps ON ps.Id = ptmps.PortalSectorId
JOIN dbo.Sector s ON s.Id = ps.SectorId
WHERE
    ptmps.PortalSectorId IN (21, 18, 19)

我已经做了一个 PIVOT,但是有一个包含三列的表,其中一列包含数据透视表中标题的值。在这种情况下,标题的值丢失了,所以我不知道该怎么做。

感谢帮助

最佳答案

你可以这样解决:

-- Create demo data
CREATE TABLE #cats(category nvarchar(25), sector nvarchar(25))

INSERT INTO #cats(category, sector)
VALUES  (N'Bulbs',N'DIY'),
        (N'Bulbs',N'Home'),
        (N'Picnic blanket',N'DIY'),
        (N'Picnic blanket',N'Home'),
        (N'Picnic blanket',N'Interior')

SELECT *
FROM (
    SELECT category, sector
    FROM #cats
) as dat
PIVOT(
    MAX(sector)
    FOR sector IN([DIY],[Home],[Interior])
) as pvt

-- Cleanup
DROP TABLE #cats

如果您希望它像示例中一样正确命名,您可以将它与命名编号结合使用:

-- Create demo data
CREATE TABLE #cats(category nvarchar(25), sector nvarchar(25))

INSERT INTO #cats(category, sector)
VALUES  (N'Bulbs',N'DIY'),
        (N'Bulbs',N'Home'),
        (N'Picnic blanket',N'DIY'),
        (N'Picnic blanket',N'Home'),
        (N'Picnic blanket',N'Interior')

SELECT *
FROM (
    SELECT category, sector, N'Sector '+CONVERT(nvarchar(max),DENSE_RANK() OVER(ORDER BY sector)) as rn
    FROM #cats
) as dat
PIVOT(
    MAX(sector)
    FOR rn IN([Sector 1],[Sector 2],[Sector 3])
) as pvt

-- Cleanup
DROP TABLE #cats

最后但同样重要的是,如果您希望它是动态的:

-- Create demo data
CREATE TABLE #cats(category nvarchar(25), sector nvarchar(25))

INSERT INTO #cats(category, sector)
VALUES  (N'Bulbs',N'DIY'),
        (N'Bulbs',N'Home'),
        (N'Picnic blanket',N'DIY'),
        (N'Picnic blanket',N'Home'),
        (N'Picnic blanket',N'Interior')

DECLARE @sql nvarchar(max), @cols nvarchar(max)

-- get proper column list
SELECT @cols = COALESCE(@cols + N',[' + grCols.rn + N']',N'[' + grCols.rn + N']')
FROM (
    SELECT DISTINCT N'Sector '+CONVERT(nvarchar(max),DENSE_RANK() OVER(ORDER BY sector)) as rn
    FROM #cats
) as grCols

SET @sql = N'
SELECT *
FROM (
    SELECT category, sector, N''Sector ''+CONVERT(nvarchar(max),DENSE_RANK() OVER(ORDER BY sector)) as rn
    FROM #cats
) as dat
PIVOT(
    MAX(sector)
    FOR rn IN('+@cols+')
) as pvt'
EXEC(@sql)

-- Cleanup
DROP TABLE #cats

关于只有两列的 SQL Pivot,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31378740/

相关文章:

SQL 如何从字符串中提取数字?

sql - 必须声明标量变量 SQL Server?

php - 扩展 PDO 准备方法以替换查询前缀

sql - SQL UDF 中不带 DEFAULT 关键字的可选参数

sql-server - nvarchar和varchar的空间分配

mysql - 删除 SQL 表中的额外\in XML 列

sql-server - 如何将本地 Visual Studio mdf 数据库导出为 Azure SQL 数据库的格式

sql-server - 在模式之间复制大过程

sql - 临时表的默认排序规则

sql - 在具有复合 PK 的表上使用 where in 两次是否足够?