[英]Displaying results based on record count using SQL
我有一個名為schoolDB的數據庫和2個數據庫表,
student
和education
創建學生表:
USE [schoolDB]
GO
/****** Object: Table [dbo].[tblStudent] Script Date: 09/22/2013 17:30:11 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[tblStudent](
[STUDENTNUMBER] [varchar](50) NOT NULL,
[STUDENTNAME] [varchar](50) NULL,
[EDUCATIONID] [varchar](50) NULL,
CONSTRAINT [PK_tblStudent] PRIMARY KEY CLUSTERED
(
[STUDENTNUMBER] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
創建教育表:
USE [schoolDB]
GO
/****** Object: Table [dbo].[tblEducation] Script Date: 09/22/2013 17:31:30 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[tblEducation](
[EDUCATIONID] [varchar](50) NOT NULL,
[STUDENTNUMBER] [varchar](50) NULL,
[INSTITUTIONNAME] [varchar](50) NULL,
[COURSENAME] [varchar](50) NULL,
[GRADE] [varchar](50) NULL,
[YEAROFLEAVING] [varchar](50) NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
以下是數據的屏幕截圖:
我希望能夠找到每個去過一所名為Secondary School
的機構名稱的人,並且他的另一個教育記錄是like
biol
like
的課程名稱。 不僅限於生物學,我想找到所有的科學,所以我需要提出多個相似的陳述。
我試過這個:
SELECT COUNT(*) AS 'Our Students',
DTOurStudents.STUDENTNAME
FROM (SELECT TOP 2 TBLSTUDENT.STUDENTNUMBER,
TBLSTUDENT.STUDENTNAME,
TBLEDUCATION.INSTITUTIONNAME,
TBLEDUCATION.COURSENAME
FROM TBLEDUCATION
INNER JOIN TBLSTUDENT
ON TBLEDUCATION.STUDENTNUMBER = TBLSTUDENT.STUDENTNUMBER
WHERE TBLEDUCATION.INSTITUTIONNAME LIKE '%Secondary School%')
DTOurStudents
GROUP BY DTOurStudents.STUDENTNAME
SQL FIDDLE: http ://sqlfiddle.com/#!3/666f8/2
這將為您提供一份學生名單和大學課程(每所大學),通過加入機構表自己。
SELECT
STUDENTNUMBER,
SCHOOL_NAME,
COLLEGE_NAME,
count(*) as COLLEGE_COURSES
FROM (
SELECT
school.STUDENTNUMBER,
school.INSTITUTIONNAME AS SCHOOL_NAME,
college.INSTITUTIONNAME AS COLLEGE_NAME
FROM dbo.tblEducation as school
INNER JOIN dbo.tblEducation as college ON school.STUDENTNUMBER = college.STUDENTNUMBER
WHERE school.INSTITUTIONNAME = 'Secondary School'
AND college.INSTITUTIONNAME <> 'Secondary School'
AND (college.COURSENAME like 'biol%'
OR college.COURSENAME like 'math%'
OR college.COURSENAME like 'etc%')
) AS c
GROUP BY STUDENTNUMBER, SCHOOL_NAME, COLLEGE_NAME
如果你想要大學的coursename那么你可以在內部查詢中返回。 但由於每個大學課程只有一個記錄,外部select
和group by
將是多余的。
SELECT
school.STUDENTNUMBER,
school.INSTITUTIONNAME AS SCHOOL_NAME,
college.INSTITUTIONNAME AS COLLEGE_NAME,
college.COURSENAME
FROM dbo.tblEducation as school
INNER JOIN dbo.tblEducation as college ON school.STUDENTNUMBER = college.STUDENTNUMBER
WHERE school.INSTITUTIONNAME = 'Secondary School'
AND college.INSTITUTIONNAME <> 'Secondary School'
AND (college.COURSENAME like 'biol%'
OR college.COURSENAME like 'math%'
OR college.COURSENAME like 'etc%'
一個簡單的答案。
ORDER BY
使用表達式來確保中學首先出現。 您的問題不明確的是當有超過2行時會發生什么。 在這種情況下,它們都會顯示,但查詢很容易調整(在rn <= 2上添加row_number和filter)。
小提琴: http ://sqlfiddle.com/#!3/666f8/89/0
WITH cte as (
SELECT
STUDENTNUMBER,
COURSENAME,
INSTITUTIONNAME,
COUNT(*) OVER (PARTITION BY STUDENTNUMBER) AS RecordCount
FROM tblEducation
WHERE INSTITUTIONNAME = 'Secondary School'
OR COURSENAME like 'biol%'
OR COURSENAME like 'math%'
OR COURSENAME like 'etc%'
)
select *
from cte
where RecordCount >= 2
order by
studentnumber,
case when institutionname = 'Secondary School' then 1 else 2 end
編輯
評論正確地指出查詢不會檢查是否至少有一所中學和另一項教育。 可能有兩所中學,或根本沒有中學!
可以使用下面稍微復雜的查詢來處理這些情況:
WITH cte as (
SELECT
STUDENTNUMBER,
COURSENAME,
INSTITUTIONNAME,
SUM(CASE INSTITUTIONNAME WHEN 'Secondary School' THEN 1 END)
OVER (PARTITION BY STUDENTNUMBER) AS SecondarySchoolCount,
SUM(CASE WHEN INSTITUTIONNAME <> 'Secondary School'
AND COURSENAME LIKE 'biol%'
THEN 1 END)
OVER (PARTITION BY STUDENTNUMBER) AS CourseCount
FROM tblEducation
WHERE INSTITUTIONNAME = 'Secondary School'
OR COURSENAME like 'biol%'
OR COURSENAME like 'math%'
OR COURSENAME like 'etc%'
)
select *
from cte
where SecondarySchoolCount >= 1 AND CourseCount >= 1
order by
studentnumber,
case when institutionname = 'Secondary School' then 1 else 2 end
如果要顯示兩個行,可以使用此查詢:
select a.*
from tblEducation as a
where
exists (
select *
from tblEducation as t
where t.INSTITUTIONNAME = 'Secondary School' and t.STUDENTNUMBER = a.STUDENTNUMBER
) and
exists (
select *
from tblEducation as t
where t.INSTITUTIONNAME <> 'Secondary School' and t.STUDENTNUMBER = a.STUDENTNUMBER
)
或者你可以這樣做:
with cte as (
select
a.STUDENTNUMBER
from tblEducation as a
group by
a.STUDENTNUMBER,
case when a.INSTITUTIONNAME = 'Secondary School' then 1 else 0 end
)
select a.*
from tblEducation as a
where
a.STUDENTNUMBER in (
select t.STUDENTNUMBER
from cte as t group by t.STUDENTNUMBER
having count(*) > 1
)
實際上,如果至少有一行包含INSTITUTIONNAME = 'Secondary School'
且至少有一行包含INSTITUTIONNAME <> 'Secondary School'
,則這兩個查詢都會顯示STUDENTNUMBER的所有行
嘗試這個
WITH CTE AS
(
SELECT E.STUDENTNUMBER
FROM (SELECT * FROM TBLEDUCATION WHERE INSTITUTIONNAME LIKE '%Secondary School%') E
INNER JOIN (SELECT * FROM TBLEDUCATION WHERE INSTITUTIONNAME NOT LIKE '%Secondary School%' AND COURSENAME LIKE '%biol%') E1
ON E.STUDENTNUMBER=E1.STUDENTNUMBER
)
SELECT *
FROM TBLSTUDENT S
INNER JOIN TBLEDUCATION E
ON S.STUDENTNUMBER = E.STUDENTNUMBER
WHERE S.STUDENTNUMBER IN (SELECT STUDENTNUMBER FROM CTE)
SELECT DISTINCT s.STUDENTNUMBER
FROM tblStudent s
INNER JOIN tblEducation e
ON (s.studentnumber = e.studentnumber and (
e.institutionname = 'Secondary School'
or e.coursename like '%biol%'
OR e.coursename like '%math%'
))
應該管用?
以下示例在相關子查詢上使用EXISTS運算符,該子查詢具有連接兩個查詢
SELECT *
FROM dbo.tblEducation t
WHERE EXISTS (SELECT 1
FROM (SELECT e.STUDENTNUMBER
FROM dbo.tblEducation e
WHERE e.INSTITUTIONNAME = 'Secondary School'
) x JOIN (SELECT e2.STUDENTNUMBER
FROM dbo.tblEducation e2
WHERE e2.INSTITUTIONNAME != 'Secondary School'
) x2 ON x.STUDENTNUMBER = x2.STUDENTNUMBER
WHERE x.STUDENTNUMBER = t.STUDENTNUMBER
)
請參閱SQLFiddle
演示
要么
SELECT *
FROM tblEducation t3
WHERE EXISTS(SELECT t.STUDENTNUMBER
FROM tblEducation t
WHERE t.INSTITUTIONNAME LIKE 'Secondary School'
AND EXISTS(SELECT 1
FROM tblEducation t2
WHERE t.STUDENTNUMBER = t2.STUDENTNUMBER
AND t2.INSTITUTIONNAME != t.INSTITUTIONNAME
)
AND t3.STUDENTNUMBER = t.STUDENTNUMBER
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.