【问题标题】:How to select distinct values and have the differences as seperate columns in the same table如何选择不同的值并将差异作为同一表中的单独列
【发布时间】:2015-03-05 22:41:17
【问题描述】:

我在课程和辅导员之间有一对多的关系。外键在 Course 表中。如何选择不同的辅导员并将其多个课程 ID 作为辅导员旁边的列。

SELECT dbo.Facilitator.Fac_ID, dbo.Facilitator.Fac_Name, dbo.Course.Course_ID
FROM dbo.Course 
RIGHT JOIN dbo.Facilitator ON dbo.Course.FK_Facilitator = dbo.Facilitator.Fac_ID 
order by dbo.Facilitator.Fac_Name asc

返回:

相反,我想要:

【问题讨论】:

  • 但是如果突然有 3 个(或 4 个)John 项目呢?
  • 仔细看看这个问题和接受的答案(对我来说似乎是某种重复):stackoverflow.com/a/28696994/4584335 只需一点 SQL 技能,你应该能够得到你的答案。
  • 同意@Ru​​bik 关于这一点。如果这是 SQL Server,则使用 PIVOT。如果这在任何其他 RDBMS 附近都该死,那么您还有一些工作要做,特别是如果每​​个名称都可能有很大的变量数。
  • 忘了说,一位辅导员只能属于 1 或 2 门课程,永远不会更多。
  • 会看看那个链接

标签: sql-server select distinct


【解决方案1】:

对于透视,应定义列名。根据您的问题,在您的情况下,您没有这样的列名。所以我们创建示例列名称,如 1,2 等。

首先,获取pivot的列名

DECLARE @cols NVARCHAR (MAX)

SELECT @cols = COALESCE (@cols + ',[' + COLUMNNAME + ']', '[' + COLUMNNAME + ']')
               FROM    
               (
                   -- Generates random column names numerically from 1,2 etc
                   SELECT DISTINCT CAST(ROW_NUMBER() OVER(PARTITION BY ID ORDER BY (SELECT 0))AS VARCHAR(4))COLUMNNAME 
                   FROM #TEMP
               ) PV 
               ORDER BY CAST(COLUMNNAME AS INT)

现在旋转结果。里面的逻辑我写好了。

DECLARE @query NVARCHAR(MAX)
SET @query = '-- This outer query forms your pivoted result
             SELECT * FROM 
             (
                -- Source data for pivoting                
                SELECT ID,NAME,VALUE,
                CAST(ROW_NUMBER() OVER(PARTITION BY ID ORDER BY (SELECT 0))AS VARCHAR(4)) COLUMNNAME  
                FROM #TEMP 
             ) x
             PIVOT 
             (
                 --Defines the values in each dynamic columns
                 MIN(VALUE)
                 -- Get the names from the @cols variable to show as column
                 FOR COLUMNNAME IN (' + @cols + ')
            ) p            
            ORDER BY NAME;' 

EXEC SP_EXECUTESQL @query

【讨论】:

  • 感谢@Sarath Avanavu 的回复。它绝对帮助我指出了正确的方向。我还有很多东西要学。
  • 所以请点击答案左侧的TICK按钮标记为答案@Jnr
猜你喜欢
  • 1970-01-01
  • 2013-05-02
  • 1970-01-01
  • 2013-10-14
  • 1970-01-01
  • 2021-11-11
  • 1970-01-01
  • 1970-01-01
  • 2013-04-12
相关资源
最近更新 更多