当前位置: 首页 > 面试题库 >

SQL Server-按所有组返回的记录数进行汇总

云新知
2023-03-14
问题内容

假设我的SQL Server 2012数据库中有下表:

MyTable:

DateCol       FkId    Sector      Value
--------------------------------------------
2018-01-01     1        A            1
2018-01-02     1        A            2
2018-01-03     1        A            3
2018-01-04     1        A            4
2018-01-01     1        B            1
2018-01-04     1        B            4
2018-01-01     1        C            1
2018-01-03     1        C            3
2018-01-04     1        C            4
2018-01-01     2        A            1
...

我想获取特定扇区的每个扇区的平均值FkId但要基于FkId的总数中可用的日期总数 。也就是说,如果我想获得的平均FkId=
1的日期,也就是说,2018-01-012018-01-10我的结果集将是:

Sector       AvgVal
---------------------------------
A            (1+2+3+4) / 4 = 2.5
B            (1+4) / 4 = 1.25
C            (1+3+4) / 4 = 2

换句话说,不除以该部门可用的日期数,而是除以该表中该日期范围的日期总数FkId

我认为可以通过以下方式对CTE进行此操作:

DECLARE @FkId INT = 1,
        @StartDate DATE = '2018-01-01',
        @EndDate DATE = '2018-01-10'

DECLARE @MyTable TABLE
                 (
                     DateCol DATE,
                     FkId INT,
                     Sector VARCHAR(1),
                     Value FLOAT
                 );

INSERT INTO @MyTable (DateCol, FkId, Sector, Value)
VALUES
    ('2018-01-01', 1, 'A', 1),
    ('2018-01-02', 1, 'A', 2),
    ('2018-01-03', 1, 'A', 3),
    ('2018-01-04', 1, 'A', 4),

    ('2018-01-01', 1, 'B', 1),
    ('2018-01-04', 1, 'B', 4),

    ('2018-01-01', 1, 'C', 1),
    ('2018-01-03', 1, 'C', 3),
    ('2018-01-04', 1, 'C', 4),

    ('2018-01-01', 2, 'A', 1);

WITH NumDates AS
(
    SELECT
        Sector,
        COUNT(DateCol) AS cnt
    FROM
        @MyTable
    WHERE
        DateCol BETWEEN @StartDate AND @EndDate
        AND FkId = @FkId
    GROUP BY
        Sector
),
MaxNumDates AS
(
    SELECT
        MAX(cnt) AS MaxNum
    FROM
        NumDates
)
SELECT
    Sector,
    SUM(Value) / MaxNum AS AvgVal
FROM
    @MyTable
JOIN 
    MaxNumDates ON 1 = 1
WHERE
    DateCol BETWEEN @StartDate AND @EndDate
    AND FkId = @FkId
GROUP BY
    Sector, MaxNum

但我真的希望有更好的方法。有什么想法吗?


问题答案:

试试这个:

select dateCol,
       fkid, 
       sector,
       sum(value) over (partition by fkid, sector) /
       (select count(distinct dateCol) from @MyTable where fkid = t.fkid)
from @MyTable t

或者

select fkid, 
       sector,
       sum(value) /
       (select count(distinct dateCol) from @MyTable where fkid = t.fkid)
from @MyTable t
group by fkid, sector


 类似资料:
  • 问题内容: 我在Elasticsearch中有一个小型数据库,出于测试目的,我想拉回所有记录。我正在尝试使用以下形式的网址… 有人可以给我您用来完成此操作的URL吗? 问题答案: 我认为支持lucene语法是这样的: 大小默认为10,因此您可能还需要获取10个以上的商品。(其中BIGNUMBER等于您认为大于数据集的数字) 但是,elasticsearch文档建议使用扫描搜索类型针对大型结果集。

  • 问题内容: 我正在尝试读取sqlite3表中的所有记录,并通过回调返回它们。但是似乎尽管使用了序列化,但这些调用仍然是ASYNC。这是我的代码: 触发回调后,数组将打印“ []”。 我是否可以打另一个电话(而不是db.each),一次就能给我所有行。我不需要遍历这里的每一行。 如果没有,如何读取所有记录,然后才调用带有结果的回调? 问题答案: 我能够找到这个问题的答案。这是给任何正在寻找的人的:

  • 问题内容: 我在查询中发现了一些问题,该查询从表中返回满足特定条件的所有记录的字段总和。当没有记录时,我希望收到“找不到记录”,但我收到的是空结果。 在这种情况下,有什么方法可以不接收任何记录? 问题答案: 这个怎么样:

  • 问题内容: 我试图定义一个可以容纳闭包的变量,并且使用Swift的速记参数名称遇到了一些困难。采取以下代码段: 这给了我编译错误 ‘(String,String)’无法转换为’String’ 。当我修改闭包时,返回带有第一个参数值的字符串,我将两个参数值都返回到一个元组中。 但是,如果我修改闭包以打印第二个参数,则会按预期打印正确的参数。 我感觉自己在这里做些愚蠢的事情,但是我找不到任何解释为什么

  • 问题内容: 该表包含有关提供服务的部门的详细信息。该表包含由客户完成的针对特定服务的所有交易。在该条款中,应满足两个自助餐厅。我想得到一个报告,该报告显示给定期间内所有与交易有关的部门。我用过a,因为我想得到所有部门。SQL可以正常运行,并得到我想要的结果,除了, 如果在特定时期内没有针对特定服务的交易,则也将忽略该部门。我想做的是在结果集和COUNT(*)列中显示部门为0。 我怎样才能做到这一点

  • 我知道Postgres允许返回预定义的复合数据类型、记录和具有列定义的表。 然而,我没有返回一个定义了列的简单记录,所以我总是使用表,即使我知道这只返回一行。 我的函数定义如下: 如果我尝试以同样的方式返回记录,则返回失败: 这在博士后中不可能吗?我知道我可以只声明一个自定义复合数据类型,但我不想为每个返回记录的函数声明一个类型。