【问题标题】:Specific format Join results on SQL ServerSQL Server 上的具体格式 Join 结果
【发布时间】:2018-05-18 11:06:40
【问题描述】:

我已经在互联网上寻找解决方案,但到目前为止还没有。 以下是在 SID/ID 上连接的 2 个示例表

SID Name    Attendance  Class
1   abc good    1A
2   xyz bad 1B
3   dsk good    1A
4   uij bad 1B
5   sss bad 1A
6   fff good    1D
7   ccc good    1A


ID  Lesson  Result
1   Read    Pass-67%
1   Write   Pass-89%
1   Sing    Pass-99%
2   Read    Pass-75%
3   Sing    Fail-47%
3   Read    Pass-55%
4   Write   Pass-90%
4   Sing    Fail-10%

结果需要采用以下格式。 一行显示学生姓名,后跟一行学生的成绩。

如果学生没有任何结果,他们将不会被包括在内。

1,  abc,    good,   1A
1,  Read,   Pass-67%    
1,  Write,  Pass-89%    
1,  Sing,   Pass-99%    
2,  xyz,    bad,    1B
2,  Read,   Pass-75%    
3,  dsk,    good,   1A
3,  Sing,   Fail-47%    
3,  Read,   Pass-55%    
4,  uij,    bad,    1B
4,  Write,  Pass-90%    
4,  Sing,   Fail-10%    

我尝试使用 Union 无济于事,它类似于枢轴也没有任何运气。假设我在这里遗漏了一个技巧,我该如何完成?

如果数据更容易,我已经包含了数据!

CREATE TABLE RESULTS (ID Int, Lesson varchar(12), Result nvarchar(8))
insert into RESULTS (ID, Lesson, Result)
values
(1,'Read', 'Pass-67%'),
(1,'Write', 'Pass-89%'),
(1,'Sing', 'Pass-99%'),
(2,'Read', 'Pass-75%'),
(3,'Sing', 'Fail-47%'),
(3,'Read','Pass-55%'),
(4,'Write', 'Pass-90%'),
(4,'Sing', 'Fail-10%')

CREATE TABLE STUDENTS (ID int, Name varchar(5), Attendance nvarchar(10), 
Class nvarchar (3))

insert into STUDENTS values
(1,'abc','good','1A'),
(2,'xyz','bad','1B'),
(3,'dsk','good','1A'),
(4,'uij','bad','1B'),
(5,'sss','bad','1A'),
(6,'fff','good','1D'),
(7,'ccc','good','1A')

【问题讨论】:

  • "显示学生姓名的一行,后面是学生成绩的行。"这并不是 SQL 的真正工作方式。表和结果集代表 无序 集。所以,“下一行”并没有真正的意义。尽管使用有点复杂的order by 可以做到这一点,但我会质疑为什么您不希望每一行都包含学生姓名。
  • 这两个表之间没有关联(即外键)。加入这两个表?我错过了重点吗?还是您只是将这两张表混在一起?
  • 另外,您需要提供一个到目前为止您尝试过的示例。
  • 因此,您希望将第二列的含义交织为名称或课程,第三列表示出勤或结果 - 这是一个非常不寻常的要求,直觉上似乎是个坏主意。
  • 我同意这不是最佳做法。但是,我正在使用另一个程序,它只导入这种格式的数据。

标签: sql sql-server join pivot


【解决方案1】:

您可以使用UNION 和一些解决方法。

;WITH Data AS
(
    SELECT
        S.ID,
        S.Name,
        S.Attendance,
        S.Class,
        IsStudent = 1
    FROM    
        Students AS S
    WHERE
        EXISTS (SELECT 'at least one result' FROM Results AS R WHERE R.ID = S.ID)
    UNION ALL
    SELECT
        ID = R.ID,
        Name = R.Lesson,
        Attendance = R.Result,
        Class = NULL,
        IsStudent = 0
    FROM    
        Results AS R
)
SELECT
    D.ID,
    D.Name,
    D.Attendance,
    D.Class
FROM
    Data AS D
ORDER BY
    ID,
    IsStudent DESC

但是,正如您在最后的列名中看到的那样,您将不同的数据混合在一起,这不是一件好事。

【讨论】:

  • 神奇的 EzLo 这工作完美!谢谢大家
【解决方案2】:

使用union all

select t.* 
from(select ID, Name, Attendance, class 
     from STUDENTS s 
     where exists (select 1 from RESULTS where id = s.id) union all
     select ID, Lesson, Result, null
     from RESULTS r 
    ) t
order by id, (case when class is not null then 0 else 1 end);

【讨论】:

    【解决方案3】:

    简单地连接那些列和联合

    SELECT CONVERT(VARCHAR(10),id)+' , '+Name+' , '+Attendance 
    AS ResultSet        INTO #T FROM dbo.STUDENTS
    UNION ALL
    SELECT CONVERT(VARCHAR(10),ID)+' , '+Lesson+' , '+  Result 
    FROM   dbo.RESULTS
    
    SELECT * FROM #T ORDER BY ResultSet
    
    DROP TABLE #T
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多