【问题标题】:Run UNION with group by使用 group by 运行 UNION
【发布时间】:2015-04-14 11:57:05
【问题描述】:

我在使用 UNION 和 group by 方面需要帮助。

我写了下面的代码你给你我的代码的概述。我基本上是在尝试使用 UNION 运行此代码超过 x 个月。

每次我运行以下代码时,SQL SERVER 都会抱怨“类别”不在一个组中。

我尝试将其添加到代码的末尾:

按名称分组 按名称订购

当我尝试一次获取所有月份的数据时,它仍然不起作用。

如何使用 UNION 子句使我的查询运行?

SELECT
   '2000' AS Year,
    Name AS Category,
    COUNT(id) AS X
FROM
(          
    (
        Select id, Name
        From dbo.tablea
        where something
        GROUP BY id,name
        HAVING SUM(X)>0
    ) sub

    Union 

    SELECT 
        '1999' AS Year,
        Name AS Category,
        COUNT(id) AS X
    FROM
    (          
        (
            Select id, Name
            From dbo.tablea
            where something
            GROUP BY id,name
            HAVING SUM(X)>0
        ) sub

【问题讨论】:

  • 您的group by 没有列名。修复代码为group by name
  • 我知道这一点。我只是为了节省时间才写在这里。
  • 写下您的完整查询,以便我们找到解决方案
  • @dataaddicted “我只是为了节省时间才把它写在这里”试图以牺牲读者的时间为代价来节省你的时间是没有办法得到有效答案的。
  • 并以可读的形式格式化您的查询...

标签: sql sql-server


【解决方案1】:

让我们看一下查询的第一部分:

SELECT '2000' AS Year, Name AS Category, COUNT(id) AS X
FROM
(
  Select id, Name
  From dbo.tablea
  where ...
  GROUP BY id, Name
  HAVING SUM(X)>0
) sub

(我删除了一个不属于那里的左括号。)

您在这里使用聚合(COUNT(id),顺便说一下,这与简单的COUNT(*) 相同,因为 ID 永远不应为空)。那么您还选择了哪些其他领域?一个字面的“2000”,可以,还有名字。但是哪个名字?最大限度?分钟?您没有指定它,这就是 DBMS 告诉您的。所以either在Name上使用聚合,如MIN(Name) group by it(通过在“sub”别名后添加GROUP BY Name),从而得到一个每个名称一行。

这是按名称分组的完整查询:

SELECT '2000' AS Year, Name AS Category, COUNT(id) AS X
FROM
(
  Select id, Name
  From dbo.tablea
  where ...
  GROUP BY id, Name
  HAVING SUM(X)>0
) sub
GROUP BY Name
UNION
SELECT '1999' AS Year, Name AS Category, COUNT(id) AS X
FROM
(
  Select id, Name
  From dbo.tablea
  where ...
  GROUP BY id, Name
  HAVING SUM(X)>0
) sub
GROUP BY Name;

【讨论】:

    猜你喜欢
    • 2012-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    • 2017-06-09
    • 2015-03-22
    相关资源
    最近更新 更多