Sql 分组方式和多列计数和总和

Sql 分组方式和多列计数和总和,sql,ms-access,count,sum,Sql,Ms Access,Count,Sum,我有一张学生成绩表 AG T1 T2 T3 L0011001 A B A L0011002 A B B L0011003 A A C L0011004 A A C 我希望AG的输出如下所示: L0011001 2A 1B L0011002 1A 2B L00

我有一张学生成绩表

AG          T1    T2     T3
L0011001    A     B       A          
L0011002    A     B       B          
L0011003    A     A       C          
L0011004    A     A       C          
我希望AG的输出如下所示:

L0011001       2A 1B
L0011002       1A 2B
L0011003       2A 1C
L0011004       2A 1C

如何获取此信息?

您的数据格式非常非常糟糕。每个“T”和每个学生应该有一行

然而,有时我们会遇到糟糕的数据格式。使用
iif()
,您可以做任何您想做的事情:

这并不是你想要的。它将值放在单独的列中——这种格式对我来说更有意义

对于您的特定格式:

select ag,
       (iif(A_s > 0, A_s & "A ") &
        iif(B_s > 0, B_s & "B ") &
        iif(C_s > 0, C_s & "C ")
       )
from (select ag,
             (iif(t1 = 'A', 1, 0) + iif(t2 = 'A', 1, 0) + iif(t2 = 'A', 1, 0)) as A_s,
             (iif(t1 = 'B', 1, 0) + iif(t2 = 'B', 1, 0) + iif(t2 = 'B', 1, 0)) as B_s,
             (iif(t1 = 'C', 1, 0) + iif(t2 = 'C', 1, 0) + iif(t2 = 'C', 1, 0)) as C_s
      from t
     ) as x

您的数据格式非常非常糟糕。每个“T”和每个学生应该有一行

然而,有时我们会遇到糟糕的数据格式。使用
iif()
,您可以做任何您想做的事情:

这并不是你想要的。它将值放在单独的列中——这种格式对我来说更有意义

对于您的特定格式:

select ag,
       (iif(A_s > 0, A_s & "A ") &
        iif(B_s > 0, B_s & "B ") &
        iif(C_s > 0, C_s & "C ")
       )
from (select ag,
             (iif(t1 = 'A', 1, 0) + iif(t2 = 'A', 1, 0) + iif(t2 = 'A', 1, 0)) as A_s,
             (iif(t1 = 'B', 1, 0) + iif(t2 = 'B', 1, 0) + iif(t2 = 'B', 1, 0)) as B_s,
             (iif(t1 = 'C', 1, 0) + iif(t2 = 'C', 1, 0) + iif(t2 = 'C', 1, 0)) as C_s
      from t
     ) as x

你可能想考虑一个联合查询和一个交叉表,输出并不完全符合你的意愿,但它确实是有意义的。

TRANSFORM Count(qry.ag) AS countofag
SELECT qry.ag
FROM   (SELECT tbl.ag,
               tbl.t1
        FROM   tbl
        UNION ALL
        SELECT tbl.ag,
               tbl.t2
        FROM   tbl
        UNION ALL
        SELECT tbl.ag,
               tbl.t3
        FROM   tbl) AS qry
GROUP  BY qry.ag
PIVOT qry.t1; 

你可能想考虑一个联合查询和一个交叉表,输出并不完全符合你的意愿,但它确实是有意义的。

TRANSFORM Count(qry.ag) AS countofag
SELECT qry.ag
FROM   (SELECT tbl.ag,
               tbl.t1
        FROM   tbl
        UNION ALL
        SELECT tbl.ag,
               tbl.t2
        FROM   tbl
        UNION ALL
        SELECT tbl.ag,
               tbl.t3
        FROM   tbl) AS qry
GROUP  BY qry.ag
PIVOT qry.t1; 

非常感谢,非常有帮助。回复很快。非常感谢,非常有帮助。反应很快。