Получить данные из таблицы согласно условию с другой сущностью - PullRequest
0 голосов
/ 15 октября 2019

У меня есть таблица сведений о сотрудниках, где я поддерживаю два языка, таких как английский и арабский. Теперь, когда сотрудник зарегистрирован, он заполняет профиль на английском и арабском языках. Поэтому я хочу подсчитать тех сотрудников, которые заполнили его данные на обоих языках.

Таблица: EmployeeDetails

UserID | FirstName | LastName | LanguageId
1          temp         user       1
1          temp1        user1      2
2          temp         user       1
2          NULL         NULL       2

Итак, здесь я хочу подсчитать тех сотрудников, которые имеют данные на обоих языках. Так что должно быть 1.

Я пытался с этим запросом, как:

SELECT COUNT(*) FROM EmployeeDetails
WHERE FirstName IS NOT NULL AND LastName IS NOT NULL

Но это дает мне неправильный результат. Так как я могу получить результат ожидания?

Ответы [ 3 ]

1 голос
/ 15 октября 2019

Лично кажется, что проблема в вашем дизайне, а не в данных. У вас должно быть 3 таблицы, а не 2 здесь. Один для пользователей, другой для языков, а затем последний для языков, которые есть у пользователя. Как то так:

CREATE TABLE dbo.Users (UserID int NOT NULL,
                        FirstName varchar(50),
                        LastName varchar(50));

ALTER TABLE dbo.Users ADD CONSTRAINT PK_UserID PRIMARY KEY (UserID);
GO

CREATE TABLE dbo.Languages (LanguageID int NOT NULL,
                            LanguageName varchar(50))

ALTER TABLE dbo.Languages ADD CONSTRAINT PK_LanguageID PRIMARY KEY (LanguageID);
GO

CREATE TABLE dbo.UserLanguages (UserID int NOT NULL,
                                LanguageID int NOT NULL);

ALTER TABLE dbo.UserLanguages ADD CONSTRAINT PK_UserLanguage PRIMARY KEY (UserID,LanguageID);

ALTER TABLE dbo.UserLanguages ADD CONSTRAINT FK_UserID FOREIGN KEY (UserID) REFERENCES dbo.Users(UserID);
ALTER TABLE dbo.UserLanguages ADD CONSTRAINT FK_LanguageID FOREIGN KEY (LanguageID) REFERENCES dbo.Languages(LanguageID);

GO

INSERT INTO dbo.Users (UserID,
                       FirstName,
                       LastName)
VALUES (1,'temp','user'),
       (2,'test','login');
GO

INSERT INTO dbo.Languages (LanguageID,
                           LanguageName)
VALUES(1,'English'),
      (2,'Arabic');

GO

INSERT INTO dbo.UserLanguages (UserID,
                               LanguageID)
VALUES(1,1),
      (1,2),
      (2,1),
      (2,2);

GO

SELECT COUNT(*) --2, as there are 2 users
FROM dbo.Users;

SELECT COUNT(*) --Also 2, as both users are learning English
FROM dbo.Users U
     JOIN dbo.UserLanguages UL ON U.UserID = UL.UserID
     JOIN dbo.Languages L ON UL.LanguageID = L.LanguageID
WHERE L.LanguageName = 'English';

SELECT COUNT(*) --4, as there are 2 users, learning 2 languages each (2 * 2 = 4)
FROM dbo.Users U
     JOIN dbo.UserLanguages UL ON U.UserID = UL.UserID
     JOIN dbo.Languages L ON UL.LanguageID = L.LanguageID;
GO

DROP TABLE dbo.UserLanguages
DROP TABLE dbo.Users;
DROP TABLE dbo.Languages
0 голосов
/ 15 октября 2019

Я думаю, что вы можете делать что хотите, используя агрегацию и having:

select ed.userid
from employeedetails ed
where ed.languageid in (1, 2)
group by ed.userid
having count(*) = 2;  - number of languages
0 голосов
/ 15 октября 2019

Кажется, вам нужно distinct count()

Select count(distinct userid) from EmployeeDetails
where FirstName is not null and LastName is not null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...