Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何计算来自多个列的重复值?_Sql_Ms Access - Fatal编程技术网

Sql 如何计算来自多个列的重复值?

Sql 如何计算来自多个列的重复值?,sql,ms-access,Sql,Ms Access,我有一个access表(称为year2016),其中包含月份列、客户机名称行以及在本月执行作业的员工姓名。我希望sql代码能告诉我每个工人每月处理多少个客户机 该表如下所示: client month01 month02 month03 month04 ....... 1 john adam sarah john 2 adam adam john sarah . . .

我有一个access表(称为year2016),其中包含月份列、客户机名称行以及在本月执行作业的员工姓名。我希望sql代码能告诉我每个工人每月处理多少个客户机

该表如下所示:

client   month01    month02     month03   month04 .......
1         john       adam        sarah      john
2         adam        adam        john      sarah
.
.
.
我是sql新手,我尝试过这个(同时尝试了两个月),但它给了我错误:

SELECT a.name, c1.count, c2.count
FROM (SELECT month01 AS name FROM year2016 UNION SELECT month02 FROM year2016) a
LEFT JOIN (SELECT month01, COUNT(*) AS count FROM year2016 GROUP BY month01) c1
ON a.name=c1.month01
LEFT JOIN (SELECT month02, COUNT(*) AS count FROM year2016 GROUP BY month02) c2
On a.name=c2.month02;
我希望得到这样的桌子:

worker     month01     month02    month03    month04 ......
john           8           14        5          9
adam           12            6          5        3
sarah           4            6         34        56

一种方法可能是首先将所有月份列合并为一个列,然后按月透视:

SELECT
    worker,
    SUM(IIF(month='month01', 1, 0)) AS month01,
    SUM(IIF(month='month02', 1, 0)) AS month02,
    SUM(IIF(month='month03', 1, 0)) AS month03,
    SUM(IIF(month='month04', 1, 0)) AS month04,
    SUM(IIF(month='month05', 1, 0)) AS month05,
    SUM(IIF(month='month06', 1, 0)) AS month06,
    SUM(IIF(month='month07', 1, 0)) AS month07,
    SUM(IIF(month='month08', 1, 0)) AS month08,
    SUM(IIF(month='month09', 1, 0)) AS month09,
    SUM(IIF(month='month10', 1, 0)) AS month10,
    SUM(IIF(month='month11', 1, 0)) AS month11,
    SUM(IIF(month='month12', 1, 0)) AS month12
FROM
(
    SELECT month01 AS worker, 'month01' AS month FROM year2016 UNION ALL
    SELECT month02, 'month02' FROM year2016 UNION ALL
    SELECT month03, 'month03' FROM year2016 UNION ALL
    SELECT month04, 'month04' FROM year2016 UNION ALL
    SELECT month05, 'month05' FROM year2016 UNION ALL
    SELECT month06, 'month06' FROM year2016 UNION ALL
    SELECT month07, 'month07' FROM year2016 UNION ALL
    SELECT month08, 'month08' FROM year2016 UNION ALL
    SELECT month09, 'month09' FROM year2016 UNION ALL
    SELECT month10, 'month10' FROM year2016 UNION ALL
    SELECT month11, 'month11' FROM year2016 UNION ALL
    SELECT month12, 'month12' FROM year2016
) t
GROUP BY
    worker;

但请注意,您的数据根本没有标准化。我在上面化名为
t
的子查询实际上是在Access中存储数据的方式。因此,如果可以,请尝试更改您的设计。

一种方法可能是首先将所有月份列合并到一个列中,然后按月透视:

SELECT
    worker,
    SUM(IIF(month='month01', 1, 0)) AS month01,
    SUM(IIF(month='month02', 1, 0)) AS month02,
    SUM(IIF(month='month03', 1, 0)) AS month03,
    SUM(IIF(month='month04', 1, 0)) AS month04,
    SUM(IIF(month='month05', 1, 0)) AS month05,
    SUM(IIF(month='month06', 1, 0)) AS month06,
    SUM(IIF(month='month07', 1, 0)) AS month07,
    SUM(IIF(month='month08', 1, 0)) AS month08,
    SUM(IIF(month='month09', 1, 0)) AS month09,
    SUM(IIF(month='month10', 1, 0)) AS month10,
    SUM(IIF(month='month11', 1, 0)) AS month11,
    SUM(IIF(month='month12', 1, 0)) AS month12
FROM
(
    SELECT month01 AS worker, 'month01' AS month FROM year2016 UNION ALL
    SELECT month02, 'month02' FROM year2016 UNION ALL
    SELECT month03, 'month03' FROM year2016 UNION ALL
    SELECT month04, 'month04' FROM year2016 UNION ALL
    SELECT month05, 'month05' FROM year2016 UNION ALL
    SELECT month06, 'month06' FROM year2016 UNION ALL
    SELECT month07, 'month07' FROM year2016 UNION ALL
    SELECT month08, 'month08' FROM year2016 UNION ALL
    SELECT month09, 'month09' FROM year2016 UNION ALL
    SELECT month10, 'month10' FROM year2016 UNION ALL
    SELECT month11, 'month11' FROM year2016 UNION ALL
    SELECT month12, 'month12' FROM year2016
) t
GROUP BY
    worker;

但请注意,您的数据根本没有标准化。我在上面化名为
t
的子查询实际上是在Access中存储数据的方式。所以,如果可以的话,试着改变你的设计。

它产生了什么错误?询问问题时,请始终列出错误详细信息。在尝试添加第二个联接之前,很可能需要在第一个联接周围加上括号,例如
((选择…)左联接(选择…)c1开…)左联接(选择…)c2开。name=c2.month02
。您看到我添加的额外括号了吗?将月份作为列,并将工作人员名称作为这些列的值,这是不正常的。老实说,如果对表进行规范化,使其具有像
[client]、[month]、[worker]
这样的列,从而使行像
1,01,john
,那么这将容易得多<代码>1,02,亚当<代码>2,01,亚当。。。然后您可以利用其他SQL语句类型,如TRANSFORM。。。PIVOT和其他聚合表单,而不必与联合重新组合,也不必为每个月编写单独的子查询,等等。它比需要的更复杂。它给出了什么错误?询问问题时,请始终列出错误详细信息。在尝试添加第二个联接之前,很可能需要在第一个联接周围加上括号,例如
((选择…)左联接(选择…)c1开…)左联接(选择…)c2开。name=c2.month02
。您看到我添加的额外括号了吗?将月份作为列,并将工作人员名称作为这些列的值,这是不正常的。老实说,如果对表进行规范化,使其具有像
[client]、[month]、[worker]
这样的列,从而使行像
1,01,john
,那么这将容易得多<代码>1,02,亚当<代码>2,01,亚当。。。然后您可以利用其他SQL语句类型,如TRANSFORM。。。PIVOT和其他聚合表单,而不必与联合重新组合,也不必为每个月编写单独的子查询等。它比需要的复杂。请注意,这是针对MS Access的。SQL不兼容,尤其是CASE语句。@Perkins感谢您指出这一点。Access有一种特殊的语法,不经测试很容易出错。@Perkins,我已经升级到ANSI标准了。其中一项涉及集成
案例
。如果可以,请投票。@Parfait+3票对您的票。我觉得特别奇怪的是,Access如此不同,因为它是Microsoft的产品。@Parfait老实说,我真的很喜欢Access,就像我讨厌它一样:),但我看不到Access在那个级别上被更改,因为还有太多其他古怪的、旧的范例方面也需要更新。我更愿意看到微软努力生产一个Access替代品,实现完全的.Net支持,实现可接受的设计模式和安全性,等等。也许那时他们可以实现ANSI-SQL,但在此之前,我会对未来潜力有限的产品的不兼容性感到畏缩。请注意,这是针对微软Access的。SQL不兼容,尤其是CASE语句。@Perkins感谢您指出这一点。Access有一种特殊的语法,不经测试很容易出错。@Perkins,我已经升级到ANSI标准了。其中一项涉及集成
案例
。如果可以,请投票。@Parfait+3票对您的票。我觉得特别奇怪的是,Access如此不同,因为它是Microsoft的产品。@Parfait老实说,我真的很喜欢Access,就像我讨厌它一样:),但我看不到Access在那个级别上被更改,因为还有太多其他古怪的、旧的范例方面也需要更新。我更愿意看到微软努力生产一个Access替代品,实现完全的.Net支持,实现可接受的设计模式和安全性,等等。也许那时他们可以实现ANSI-SQL,但在此之前,我会对未来潜力有限的产品的不兼容性感到畏缩。