【问题标题】:COUNT without GROUP BY clause issue没有 GROUP BY 子句的 COUNT 问题
【发布时间】:2016-01-10 17:16:19
【问题描述】:

我可能在这里遗漏了一些简单的东西。我有第一张桌子:

CREATE TABLE [Orgnzs] (
    [id] INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
    [nm] NVARCHAR(256)
);

然后还有几个这样创建的表(都具有相同的结构):

-- WLog_* tables are all created as such
CREATE TABLE [WLog_1] (
    [id] BIGINT NOT NULL IDENTITY(1,1) PRIMARY KEY,
    [huid] UNIQUEIDENTIFIER,
    [dtin] BIGINT,
    [dtout] BIGINT,
    [cnm] NVARCHAR(15),
    [batt] TINYINT,
    [pwrop] TINYINT,
    [pst] INT,
    [flgs] INT,
    [ppocs] NVARCHAR(1024),
    [ppocu] NVARCHAR(1024),
    [por] NVARCHAR(1024)
);

和一组类似的表格,没有上表的最后 3 列:

-- ULog_* tables are all created as such
CREATE TABLE [ULog_1] (
    [id] BIGINT NOT NULL IDENTITY(1,1) PRIMARY KEY,
    [huid] UNIQUEIDENTIFIER,
    [dtin] BIGINT,
    [dtout] BIGINT,
    [cnm] NVARCHAR(15),
    [batt] TINYINT,
    [pwrop] TINYINT,
    [pst] INT,
    [flgs] INT
);

我的目标是从任意一组 WLog_* 和 ULog_* 表中选择记录,并通过可管理的元素数量(对于页面布局)进行限制,我还需要知道找到的记录总数。

所以我这样选择:

SELECT  b.[id] AS evtID,
        b.[huid] as huid,
        b.[dtin] as dtin,
        b.[dtout] as dtout,
        b.[cnm] as cnm,
        b.[batt] as batt,
        b.[pwrop] as pwrop,
        b.[pst] as pst,
        b.[flgs] as flgs,
        b.[ppocs] as ppocs,
        b.[ppocu] as ppocu,
        b.[por] as por,
        b.[orgID] as orgID,
        b.[wLg] as wLg,
        orgz.[nm] as orgNm
        , COUNT_BIG(*) as allRecordsFound
 FROM (
    -- next also specify the column(s) to sort by
    SELECT *, ROW_NUMBER() OVER (ORDER BY [dtin], [cnm] ASC) AS rw FROM (
        SELECT *, 1 AS orgID, 1 AS wLg
          FROM [WLog_1]
        UNION ALL
        SELECT *, 2 AS orgID, 1 AS wLg
          FROM [WLog_2]
        UNION ALL
        SELECT *, NULL AS [ppocs], NULL AS [ppocu], NULL AS [por], 1 AS orgID, 0 AS wLg
          FROM [ULog_1]
    ) a
    WHERE [pst]&1=1 OR [pst]=67
) b 
LEFT JOIN [Orgnzs] AS orgz ON orgID=orgz.[id]
WHERE rw >= 2 AND rw <= 4       -- restrict for a page only

不幸的是,在COUNT_BIG(*) as allRecordsFound 行上失败并出现以下错误:

选择列表中的“b.id”列无效,因为它不是 包含在聚合函数或 GROUP BY 子句中。

我有一段时间没有使用 SQL Server,有人可以建议我在这里缺少什么吗?

PS。出于测试目的,我made a Fiddle 尝试一下。

【问题讨论】:

    标签: sql-server sql-server-2008 tsql


    【解决方案1】:

    改用这个:

    count(*) over() as allRecordsFound
    

    您可以在不分组的情况下在select语句中混合窗口聚合功能。

    【讨论】:

    • 谢谢。它解决了错误,但它返回根据WHERE rw &gt;= 2 AND rw &lt;= 4 条件返回的行数,而不是根据[pst]&amp;1=1 OR [pst]=67 条件返回的完整计数。我是否还缺少一个嵌套的 SELECT 或那里的视图?
    • 哦,知道了。需要将计数放入我的a SELECT...谢谢。
    • 您的小提琴返回 3 行。它显示 3 作为 allRecordsFound。你还期待什么?
    • 正确的结果应该是 6,就像在页面布局的 N out of 6 记录中一样。但我把它修好了,就像我在上面发布的那样。
    • 一个后续问题。你能解释一下这个over() 的添加是做什么的吗?它还会对该查询增加任何显着的性能影响吗?
    猜你喜欢
    • 2021-11-13
    • 1970-01-01
    • 2018-09-07
    • 2011-04-24
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    相关资源
    最近更新 更多