Если мы находимся в таблице, как мы можем сделать так, чтобы одна строка данных в определенном столбце отображалась только один раз?
StudentID | Last_Name | First_Name | Gender | GradeLevel | Class | Pupil_Email | Relationship | Pupil_Parent_Email |
---|---|---|---|---|---|---|---|---|
5013 | Wang | Zack | M | Grade 9 Senior | SG9 B | 5013@example.com | папа | 5013a@qq.com |
5013 | Wang | Zack | M | Grade 9 Senior | SG9 B | 5013@example.com | Мать | 5013b@qq.com |
5014 | Liu | Aileen | F | Grade 2 Bilingual | BG2 D | 5014@example.com | папа | 5014a@qq.com |
5014 | Liu | Aileen | F | Grade 2 Bilingual | BG2 D | 5014@example.com | Мать | 5014b@qq.com |
5014 | Liu | Aileen | F | Grade 2 Bilingual | BG2 D | 5014@example.com | Мать | 5014b@qq.com |
5017 | Ying | Eason | F | Grade 9 Senior | SG9 A | 5017@example.com | папа | 5017e@qq.com |
5017 | Ying | Eason | F | Grade 9 Senior | SG9 A | 5017@example.com | папа | 5017e@qq.com |
5029 | Yan | Yuki | M | Grade 3 Bilingual | BG3 H | 5029@example.com | папа | 5029a@qq.com |
5029 | Yan | Yuki | M | Grade 3 Bilingual | BG3 H | 5029@example.com | Мать | 5029b1@qq.com |
5029 | Yan | Yuki | M | Grade 3 Bilingual | BG3 H | 5029@example.com | Мать | 5029b2@qq.com |
5029 | Yan | Yuki | M | Grade 3 Bilingual | BG3 H | 5029@example.com | Мать | 5029b3@qq.com |
как вы видете,Студенты с номерами 5014 и 5029, Мать, появляются несколько раз.,Одни и те же данные по 5017 студентам отображаются дважды. Итак, как нам сделать его данные,Это "Мать",Что, если отображается только один из них?
DISTINCT может удалять повторяющиеся данные и отображать только одну строку. Но это повторяющиеся данные для всех таблиц Select. Поэтому, если вы хотите, чтобы информация «Мать» просто отображала одну, это невозможно.
Давайте сначала удалим повторяющиеся данные 5017 студентов.
Мы выполним MIN() или MAX() для столбца, в котором хотим отобразить только один фрагмент данных [отобразить первый в соответствии с размером буквы]
За группой By следуют все данные, кроме столбца MIN().
Select DISTINCT
StudentID
,Last_Name
,First_Name
,Gender
,GradeLevel
,Class
,Pupil_Email
,Relationship
,MIN(Pupil_Parent_Email) AS Pupil_Parent_Email
From TableA
Group By StudentID
,Last_Name
,First_Name
,Gender
,GradeLevel
,Class
,Pupil_Email
,Relationship
результат:
StudentID | Last_Name | First_Name | Gender | GradeLevel | Class | Pupil_Email | Relationship | Pupil_Parent_Email |
---|---|---|---|---|---|---|---|---|
5013 | Wang | Zack | M | Grade 9 Senior | SG9 B | 5013@example.com | папа | 5013a@qq.com |
5013 | Wang | Zack | M | Grade 9 Senior | SG9 B | 5013@example.com | Мать | 5013b@qq.com |
5014 | Liu | Aileen | F | Grade 2 Bilingual | BG2 D | 5014@example.com | папа | 5014a@qq.com |
5014 | Liu | Aileen | F | Grade 2 Bilingual | BG2 D | 5014@example.com | Мать | 5014b@qq.com |
5017 | Ying | Eason | F | Grade 9 Senior | SG9 A | 5017@example.com | папа | 5017e@qq.com |
5029 | Yan | Yuki | M | Grade 3 Bilingual | BG3 H | 5029@example.com | папа | 5029a@qq.com |
5029 | Yan | Yuki | M | Grade 3 Bilingual | BG3 H | 5029@example.com | Мать | 5029b1@qq.com |
Вся наша работа, описанная выше, завершена! Что если я захочу поменять местами строки и столбцы почтового ящика в этой таблице?
Если вы хотите обменять, то, конечно, это можно сделать напрямую через PIVOT, но если мы хотим сначала посчитать, сколько почтовых ящиков старейшин у ученика, а для каждого старейшины отображается только один почтовый ящик старейшин, что нам делать?
Учебное пособие по SQL Server ROW_NUMBER() учебное пособие
Мы можем сортировать по электронной почте родителей.
Ниже приводится основное использование
ROW_NUMBER() OVER (
Order By TableA.ColumnID
) AS Count_Row_No
С помощью описанного выше метода мы вычисляем только общее количество строк (номер строки). При фактическом использовании мы вычисляем количество раз, когда ее данные появляются на основе данных определенного столбца.
Например:
ROW_NUMBER() OVER (
PARTITION By TableA.ColumnID
Order By TableA.ColumnID
) AS Count_Row_No
Это основано на ColumnID и учитывает количество раз, когда появляется один и тот же ColumnID.
Итак, подход в данном случае следующий:
Select DISTINCT
StudentID
,Last_Name
,First_Name
,Gender
,GradeLevel
,Class
,Pupil_Email
,Relationship
,MIN(Pupil_Parent_Email) AS Pupil_Parent_Email
,ROW_NUMBER() OVER (
PARTITION By TableA.StudentID
Order By TableA.StudentID
) AS Count_Row_No
From TableA
Group By StudentID
,Last_Name
,First_Name
,Gender
,GradeLevel
,Class
,Pupil_Email
,Relationship
на самом деле,ExcelПодсчет можно осуществить очень простым способом.。=COUNTIF(E 2:
Наконец, нам нужно изменить почтовый ящик со столбцов на строки.
Select * From
(
Select DISTINCT
StudentID
,Last_Name
,First_Name
,Gender
,GradeLevel
,Class
,Pupil_Email
/**
Нам нужно скрыть связи из таблицы, чтобы строки можно было превратить в столбцы в PIVOT.
**/
--,Relationship
,MIN(Pupil_Parent_Email) AS Pupil_Parent_Email
,ROW_NUMBER() OVER (
PARTITION By TableA.StudentID
Order By TableA.StudentID
) AS RelationEmailCount
From TableA
Group By StudentID
,Last_Name
,First_Name
,Gender
,GradeLevel
,Class
,Pupil_Email
,Relationship
) As BaseTable
PIVOT (
MAX(Pupil_Parent_Email)
FOR [RelationEmailCount] in ([1],[2])
) As Result
Order By Last_Name
Результат следующий:
StudentID | Last_Name | First_Name | Gender | GradeLevel | Class | Pupil_Email | 1 | 2 |
---|---|---|---|---|---|---|---|---|
5014 | Liu | Aileen | F | Grade 2 Bilingual | BG2 D | 5014@example.com | 5014a@qq.com | 5014b@qq.com |
5013 | Wang | Zack | M | Grade 9 Senior | SG9 B | 5013@example.com | 5013a@qq.com | 5013b@qq.com |
5029 | Yan | Yuki | M | Grade 3 Bilingual | BG3 H | 5029@example.com | 5029a@qq.com | 5029b1@qq.com |
5017 | Ying | Eason | F | Grade 9 Senior | SG9 A | 5017@example.com | 5017e@qq.com | NULL |
StudentID | Last_Name | First_Name | Gender | GradeLevel | Class | Pupil_Email | Relationship | Pupil_Parent_Email |
---|---|---|---|---|---|---|---|---|
5013 | Wang | Zack | M | Grade 9 Senior | SG9 B | 5013@example.com | папа | 5013a@qq.com |
5013 | Wang | Zack | M | Grade 9 Senior | SG9 B | 5013@example.com | Мать | 5013b@qq.com |
5014 | Liu | Aileen | F | Grade 2 Bilingual | BG2 D | 5014@example.com | папа | 5014a@qq.com |
5014 | Liu | Aileen | F | Grade 2 Bilingual | BG2 D | 5014@example.com | Мать | 5014b@qq.com |
5017 | Ying | Eason | F | Grade 9 Senior | SG9 A | 5017@example.com | папа | 5017e@qq.com |
5029 | Yan | Yuki | M | Grade 3 Bilingual | BG3 H | 5029@example.com | папа | 5029a@qq.com |
5029 | Yan | Yuki | M | Grade 3 Bilingual | BG3 H | 5029@example.com | Мать | 5029b1@qq.com |
Select
StudentID
,Last_Name
,First_Name
,Gender
,GradeLevel
,Class
,Pupil_Email
--,Relationship
,STRING_AGG(Pupil_Parent_Email, ',') AS Pupil_Parent_Email
From TableA
Group By StudentID
,Last_Name
,First_Name
,Gender
,GradeLevel
,Class
,Pupil_Email
,Relationship
StudentID | Last_Name | First_Name | Gender | GradeLevel | Class | Pupil_Email | Pupil_Parent_Email |
---|---|---|---|---|---|---|---|
5013 | Wang | Zack | M | Grade 9 Senior | SG9 B | 5013@example.com | 5013a@qq.com ,5013b@qq.com |
5014 | Liu | Aileen | F | Grade 2 Bilingual | BG2 D | 5014@example.com | 5014a@qq.com ,5014b@qq.com |
5017 | Ying | Eason | F | Grade 9 Senior | SG9 A | 5017@example.com | 5017e@qq.com |
5029 | Yan | Yuki | M | Grade 3 Bilingual | BG3 H | 5029@example.com | 5029a@qq.com ,5029b1@qq.com |
Затем вы можете создать новую строку разделенных столбцов путем разделения запятыми.
SQL как разделить запятые внутри значений в одном столбце на другой столбец