如何将列数据与整个表数据进行比较

时间:2019-02-15 15:29:57

标签: sql sql-server tsql

我有示例结果集:

declare @Emp Table (Emp_Name VARCHAR(10),Dept_name VARCHAR(10),Subjects VARCHAR(10),Score VARCHAR(10))
Insert into @EMP(Emp_Name,Dept_name,Subjects,Score)VALUES ('MOHAN','LANGUAGES','English',35)
Insert into @EMP(Emp_Name,Dept_name,Subjects,Score)VALUES ('MOHAN','LANGUAGES','TELUGU',35)
Insert into @EMP(Emp_Name,Dept_name,Subjects,Score)VALUES ('MOHAN','SCIENCE','BIOLOGY',35)
Insert into @EMP(Emp_Name,Dept_name,Subjects,Score)VALUES ('MOHAN','SCIENCE','PHYSICS',35)
Insert into @EMP(Emp_Name,Dept_name,Subjects,Score)VALUES ('MOHAN','SOCIAL','ECONOMICS',35)
Insert into @EMP(Emp_Name,Dept_name,Subjects,Score)VALUES ('MOHAN','SOCIAL','CIVICS',35)
Insert into @EMP(Emp_Name,Dept_name,Subjects,Score)VALUES ('MOHAN','SOCIAL','ECONOMICS',35)

样本数据

Emp_Name    Dept_name   Subjects    Score
MOHAN     LANGUAGES     English      35
MOHAN     LANGUAGES     TELUGU       35
MOHAN     SCIENCE       BIOLOGY      35
MOHAN     SCIENCE       PHYSICS      35
MOHAN     SOCIAL        ECONOMICS    35
MOHAN     SOCIAL        CIVICS       35
MOHAN     SOCIAL        ECONOMICS    35

需要将整个表数据与每个列数据进行比较:

Select COUNT(*) ALL_COl FROM (
select  Emp_Name,Dept_name,Subjects,Score from  @Emp )T


Select Count(*) Without_Subject_Col FROM (
select DISTINCT Emp_Name,Dept_name,Score from  @Emp)TT

Select count(*) Without_Dept_Col from (
select DISTINCT Emp_Name,Subjects,Score from  @Emp )TTT

Select COUNT(*) Without_Dept_Subject_Col from (
select DISTINCT Emp_Name,Score from  @Emp )TTTT

如何获得这样的输出:

ALL_COL  Without_Subject_Col   Without_Dept_Col   Without_Dept_Subject_Col
 7             3                     6                   1

建议我如何实现

3 个答案:

答案 0 :(得分:1)

您可以在外部应用计数吗?

 select top 1 a.ALL_COl, 
              aa.Without_Subject_Col, 
              aaa.Without_Dept_Col, 
              aaaa.Without_Dept_Subject_Col 
 from @EMP e
    outer apply 
        (Select COUNT(*) ALL_COl FROM (
         select  Emp_Name,Dept_name,Subjects,Score from  @Emp )T ) A
    outer apply
        (Select Count(*) Without_Subject_Col FROM (
        select DISTINCT Emp_Name,Dept_name,Score from  @Emp)TT ) AA
    outer apply
        (Select count(*) Without_Dept_Col from (
        select DISTINCT Emp_Name,Subjects,Score from  @Emp )TTT)AAA
    outer apply
        (Select COUNT(*) Without_Dept_Subject_Col from (
        select DISTINCT Emp_Name,Score from  @Emp )TTTT)AAAA

答案 1 :(得分:1)

只需选择计数作为子查询

SELECT 
(
   SELECT COUNT(*) FROM @Emp
) AS ALL_Col,
(
   SELECT COUNT(*) 
   FROM (SELECT DISTINCT Emp_Name, Dept_name, Score FROM @Emp) q
) AS Without_Subject_Col,
(
   SELECT COUNT(*) 
   FROM (SELECT DISTINCT Emp_Name, Subjects, Score FROM @Emp) q
) AS Without_Dept_Col,
(
   SELECT COUNT(*) 
   FROM (SELECT DISTINCT Emp_Name, Score FROM @Emp) q
) AS Without_Dept_Subject_Col;

上个月的测试 here

答案 2 :(得分:0)

不知道为什么要这么做,但是使用count和different可以使事情变得很简单。

Select ALL_COL = COUNT(*) 
    , Without_Subject_Col = Count(DISTINCT Emp_Name + Dept_name + convert(varchar(5), Score))
    , Without_Dept_Col = count(distinct Emp_Name + Subjects + convert(varchar(5), Score))
    , Without_Dept_Subject_Col = count(distinct Emp_Name + convert(varchar(5), Score))
from  @Emp