如何使用自定义列对连接表进行分组

时间:2021-07-20 11:42:08

标签: sql sql-server

我是 SQL 的新手,我似乎被困在一些应该很简单的事情上。

假设我有两个包含以下信息的表:

利用:

<头>
日期 用户 Metric1 Metric2
2021-07-20 John Doe 200 400
2021-07-20 XYZ 100 180
2021-07-20 ABC 20 600

原始数据

<头>
日期 帐号 Item_ID
2021-07-20 10:30:00 XYZ 1
2021-07-20 11:31:00 XYZ 2
2021-07-20 12:30:00 John Doe 3
2021-07-20 13:30:00 John Doe 4
2021-07-20 14:30:00 ABC 5

我在这里想要实现的是将这两个连接起来以显示员工给定日期的 Item_ID 计数:

<头>
日期 用户 Metric1 Metric2 计数器
2021-07-20 John Doe 200 400 2
2021-07-20 XYZ 100 180 2
2021-07-20 ABC 20 600 1

遗憾的是,下面的内容会出现以下错误:

<块引用>

列 Raw_Data.Date 在选择列表中无效,因为它不是 包含在聚合函数或 GROUP BY 子句中。

这是我尝试过的查询:

select
util.*,
count(rd.Item_ID) as Counter

from Utilisation util
join Raw_Data rd
on util.Date = cast(rd.Date as date)
where util.Date>='2021-07-19'

group by util.Date, util.User;

我的主要怀疑是我尝试了错误的连接类型,或者组部分杀死了结果,但是我找不到解决方案。

2 个答案:

答案 0 :(得分:0)

这是简单的连接。试试这个

表和数据脚本给想尝试的人

create table #Utilisation([Date] date,  [User] varchar(30),     Metric1 int, Metric2 int)
insert into #Utilisation values('2021-07-20',   'John Doe', 200,    400),('2021-07-20', 'XYZ',  100,    180),('2021-07-20', 'ABC',  20, 600)

create table #Raw_Data ([Date] datetime,    Account varchar(30), Item_ID int)
insert into #Raw_Data values ('2021-07-20 10:30:00',    'XYZ',  1),('2021-07-20 11:31:00',  'XYZ',  2),('2021-07-20 12:30:00',  'John Doe', 3),('2021-07-20 13:30:00',  'John Doe', 4), ('2021-07-20 14:30:00', 'ABC',  5)

解决方案

SELECT U.[Date], U.[User], U.Metric1, U.Metric2, R.Counter
FROM #Utilisation U
INNER JOIN (
    SELECT CONVERT(DATE, [DATE])[date], Account, Count(Item_ID)counter
    FROM #Raw_Data
    group by CONVERT(DATE, [DATE]), Account
) R ON U.Date = R.date AND U.[User] = R.Account

如果您想要 Utilization 表中的所有记录,以防 raw_data 表不包含该数据和帐户的任何数据,则使用左外连接而不是内连接。

答案 1 :(得分:0)

一个简单的方法是关联子查询:

select u.*,
       (select count(*)
        from Raw_Data rw
        where rw.account = u.user and
              rw.date >= u.date and
              rw.date < dateadd(day, u.date, 1)
       ) as cnt
from utilisation u
where u.date = '2021-07-20'

为了提高性能,您可能需要在 Row_Data(account, date) 上建立索引。

相关问题