我是 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;
我的主要怀疑是我尝试了错误的连接类型,或者组部分杀死了结果,但是我找不到解决方案。
答案 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)
上建立索引。