【问题标题】:Access union & count访问联合和计数
【发布时间】:2017-08-01 12:44:14
【问题描述】:

我完全是初学者。我有这段 SQL 代码:

SELECT Red_tag.Zglaszajacy
From Red_tag
UNION
SELECT Red_tag.Interweniujacy
From Red_tag

SELECT Count(Red_tag.Zglaszajacy) AS PoliczOfZglaszajacy, Red_tag.Interweniujacy AS PoliczOfInterweniujacy
FROM Red_tag

Union 有效,但我收到“FROM 的语法错误”。如何获得这样的输出?

|Zglaszajacy&Interweniujacy|CountOfZglaszajacy|CountOfInterweniujący|

编辑 似乎它比我想象的要复杂。 Zglaszajacy 和 Interweniujacy 是一组人。这两组也重叠(大约 30% 的人在两列都有记录)。因此,有时同一个人在 Zglaszajacy 有 3 条记录,在 Interweniujacy 有 7 条记录。这就是为什么我需要合并这两个组,然后为每个人显示两个累积计数。我不确定我是否解释得很好,所以这是一个草稿:

|Union of Zglaszający and Interweniujacy |Count of Zglaszajacy| Count of Interweniujacy|
---------------------------------------------------------------------------------------
|John Doe                               |     3              |  5                     |
|Tom Smith                              |  NULL              |  1                     |

【问题讨论】:

  • 根据您使用的 SQL,您可以访问文档。 mySQL 或 Microsoft 的 SQL。有些人不喜欢它,但您也可以随时参考 w3schools.com 进行快速试验和错误。

标签: sql ms-access


【解决方案1】:

通过使用您的 UNION 查询,您将得到一个如下所示的表:

Zglaszajacy|Interweniujacy
A           B
C           NULL
NULL        B

然后把它变成这样:

Zglaszajacy
A
C
NULL
B

您丢失了一些记录,因为 UNION 只保留不同的记录。改用 UNION ALL 来保留所有记录。

您的第二个 SQL 查询不工作,因为您没有 GROUP BY 子句来告诉聚合函数 COUNT() 它应该计算什么。

我在下面所做的是获取您的 UNION 查询并添加一个标志,以判断记录是 Zglaszajacy 类型还是 Interweniujacy 类型。然后,我将其用作 FROM 子句中的子查询。从那里,您选择您的人名并使用 COUNT() 聚合函数(或 SUM() 在这种情况下也可以工作,因为我用数字标记了它)来获取您的总数。

最后,我添加了 WHERE 子句以消除您在分组后留下的单个 NULL 名称,我认为这对您没有用处。

SELECT Person_Name, COUNT(Z_Type) AS Zglaszajacy_Count, 
    COUNT(I_Type) AS Interweniujacy_Count
FROM (SELECT Zglaszajacy as Person_Name, 1 AS Z_Type, NULL AS I_Type FROM Red_tag
      UNION ALL
      SELECT Interweniujacy, NULL, 1 FROM Red_tag)
WHERE Person_Name IS NOT NULL
GROUP BY Person_Name
ORDER BY Person_Name;

我在 MS Access 中对此进行了测试,它可以工作。

【讨论】:

  • Union 是我所需要的(至少我仍然这么认为),但事实证明我最初的问题是错误的并且不具体。我编辑了帖子。
  • 像魅力一样工作!这两天我一直在尝试制作这张表格来制作图表。谢谢!
【解决方案2】:

我想你只需要

SELECT Count(Red_tag.Zglaszajacy) AS PoliczOfZglaszajacy, Red_tag.Interweniujacy AS PoliczOfInterweniujacy


FROM Red_tag
GROUP BY Red_tag.Interweniujacy

所以不需要 UNION

【讨论】:

    【解决方案3】:
    SELECT 
        Red_tag.Zglaszajacy, 
        Red_tag.Interweniujacy, 
        (SELECT COUNT(Red_tag.Zglaszajacy) FROM Red_tag) AS PoliczOfZglaszajacy,
        (SELECT COUNT(Red_tag.Interweniujacy) FROM Red_tag) AS PoliczOfInterweniujacy
    FROM Red_tag
    

    这将为您提供所需的输出,但您可能需要考虑这是否是您想要的。第 3 列中的值将全部相同,第 4 列中的值将全部相同。此外,如果列 Zglaszajacy 和 Interweniujacy 定义为 NOT NULL,则所有计数值都将相同。

    【讨论】:

    • 感谢您的回答,正如您预测的那样,这不是我需要的。我编辑了帖子。
    猜你喜欢
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    • 1970-01-01
    • 2017-01-30
    相关资源
    最近更新 更多