Jaydeep Shah Ответов: 2

Получить высшее образование из SQL запроса


у меня есть список пользователей

где userid, имя пользователя , образование , уровень ,levelid детали у меня есть

leveltbl
b.c.a  1
m.c.a  2
phd    3


Пользователи
1  jaydeep  b.c.a  1
2  jaydeep  m.c.a  2
3  dhrumil  b.c.a  1
4  jayanti  PHD    3
5  jayanti  M.C.a  2


какой выход мне требовался (только пользователь с высшим образованием)

2  jaydeep  m.c.a  2
3  dhrumil  b.c.a  1
4  jayanti  PHD    3


Что я уже пробовал:

выберите * из пользователей, где max( ) ;(не знаю, что я здесь делаю )

Santosh kumar Pithani

Вы явно не упомянули о связи таблиц "leveltbl", поэтому обновите свой вопрос еще раз.

2 Ответов

Рейтинг:
20

Santosh kumar Pithani

CREATE  TABLE #TEMP(userid INT, username VARCHAR(50), education VARCHAR(10) , level INT);
INSERT INTO #TEMP 
VALUES(1,'jaydeep','b.c.a',1),
      (2,'jaydeep','m.c.a',2),
      (3,'dhrumil','b.c.a',1),
      (4,'jayanti','PHD', 3),
      (5,'jayanti','M.C.a',2);

WITH CTE AS (
  SELECT *,ROW_NUMBER()OVER(PARTITION BY USerNAme ORDER BY LEVEL DESC) lvl 
     FROM #temp
            )
SELECT userid, username,education,level 
  FROM CTE
     WHERE LVL=1 ORDER BY USERID ;

--------------------------------------------
userid	username	education	level
---------------------------------------------
2	jaydeep	m.c.a	2
3	dhrumil	b.c.a	1
4	jayanti	PHD	3


F-ES Sitecore

Я сомневаюсь, что курс, который он заставляет нас делать свою домашнюю работу, зашел так далеко, как CTEs :)

Santosh kumar Pithani

??

F-ES Sitecore

Очевидно, что это его домашнее задание, которое он не может сделать сам, если он представит решение с помощью CTEs, его наставник будет точно знать, что он обманул и получил решение от кого-то гораздо более опытного.

Santosh kumar Pithani

:)

Jaydeep Shah

идеальное решение для меня. спасибо

Santosh kumar Pithani

Добро Пожаловать, Джейдип!

Jaydeep Shah

обманули ??? :) @Ф-Эс компания

Рейтинг:
1

OriginalGriff

Первое, что следует отметить, это то, что вы не используете обе таблицы: ваши фактические данные должны быть
leveltbl

Desc     NVARCHAR
ID       INT, PRIMARY KEY
А это то, что у тебя есть.
Пользователи
ID       INT, probably IDENTITY, PRIMARY KEY
UName    NVARCHAR
С третьей таблицей, чтобы соединить их:
UserEducation
ID       INT, IDENTITY
UID      INT, FOREIGN KEY to Users.ID
LID      INT, FOREIGN KEY to LevelTbl.ID
Grade    INT
Таким образом, вы не храните дублирующуюся информацию, что одновременно отнимает пространство и усложняет вашу работу, поскольку позволяет ошибкам проникать внутрь, как это происходит в ваших данных: является ли "m.c.a" тем же самым, что и "M. C. a"?

Затем, чтобы получить доступ к данным, вы используете соединение:
SELECT u.UName, l.Desc, e.Grade FROM UserEducation e
JOIN Users u ON e.UID = u.ID
JOIN LevelTbl l ON e.LID = l.ID
Это дает вам ваши "сырые" данные, и довольно просто использовать GROUP BY и MAX, чтобы получить именно тот результат, который вы хотите от этого.