【问题标题】:How to count rows from a different table based on same date range如何根据相同的日期范围计算来自不同表的行数
【发布时间】:2015-09-13 10:41:35
【问题描述】:

编辑虽然接受的答案与我在写这个问题时所寻找的不匹配,但它确实显示了我已经拥有的更好的方法(这就是他们想要的)生产表中的数据是什么错误,表示数字是错误的。

我正在努力创建 sql 语句来创建这篇文章底部的报告。我已经包含了创建表和测试数据的语句。所以从这里开始是picture_stats的Creation语句

CREATE TABLE [picture_stats](
    [PICTURE_STATS_ID] [int] NULL,
    [USER_NAME] [varchar](30) NULL,
    [DATE_TIME] [datetime] NULL,
    [SIZE] [float] NULL,
    [CLICK_COUNT] [int] NULL
) ON [PRIMARY]
GO

插入将数据放入 picture_stats 的语句

INSERT INTO [picture_stats]
           ([PICTURE_STATS_ID]
           ,[USER_NAME]
           ,[DATE_TIME]
           ,[SIZE]
           ,[CLICK_COUNT])
VALUES
    (1 ,'A','2015-05-18'75,18),
    (2 ,'A','2015-05-18'13,18),
    (3 ,'A','2015-05-18'42,16),
    (4 ,'A','2015-05-18'59,16),
    (5 ,'A','2015-05-18'46,14),
    (6 ,'A','2015-05-18'64,16),
    (7 ,'A','2015-05-18'87,13),
    (8 ,'A','2015-05-18'84,14),
    (9 ,'A','2015-05-18'33,16),
    (10,'A','2015-05-18'59,14),
    (11,'B','2015-05-19'10,17),
    (12,'B','2015-05-19'44,18),
    (13,'B','2015-05-19'29,14),
    (14,'B','2015-05-19'65,19),
    (15,'B','2015-05-19'10,15),
    (16,'B','2015-05-19'55,18),
    (17,'B','2015-05-19'81,11),
    (18,'B','2015-05-19'29,11),
    (19,'B','2015-05-19'58,19),
    (20,'B','2015-05-19'20,17),
    (21,'C','2015-05-20'35,16),
    (22,'C','2015-05-20'70,18),
    (23,'C','2015-05-20'30,13),
    (24,'C','2015-05-20'33,13),
    (25,'C','2015-05-20'43,19),
    (26,'C','2015-05-20'10,15),
    (27,'C','2015-05-20'33,13),
    (28,'C','2015-05-20'23,12),
    (29,'C','2015-05-20'35,18),
    (30,'C','2015-05-20'58,19)
GO

数据的表格视图。

ID USER_NAME DATE_TIME  SIZE CLICK_COUNT
-- --------- ---------- ---- -----------
1  A         2015-05-18 75   18
2  A         2015-05-18 1    18
3  A         2015-05-18 42   16
4  A         2015-05-18 59   16
5  A         2015-05-18 46   14
6  A         2015-05-18 64   16
7  A         2015-05-18 87   13
8  A         2015-05-18 84   14
9  A         2015-05-18 33   16
10 A         2015-05-18 59   14
11 B         2015-05-19 10   17
12 B         2015-05-19 44   18
13 B         2015-05-19 29   14
14 B         2015-05-19 65   19
15 B         2015-05-19 100  15
16 B         2015-05-19 55   18
17 B         2015-05-19 81   11
18 B         2015-05-19 29   11
19 B         2015-05-19 58   19
20 B         2015-05-19 20   17
21 C         2015-05-20 35   16
22 C         2015-05-20 7    18
23 C         2015-05-20 30   13
24 C         2015-05-20 33   13
25 C         2015-05-20 4    19
26 C         2015-05-20 100  15
27 C         2015-05-20 33   13
28 C         2015-05-20 23   12
29 C         2015-05-20 35   18
30 C         2015-05-20 58   19

第二个表picture_comment_stats可以这样创建:

CREATE TABLE [picture_comment_stats](
    [PICTURE_STATS_ID] [int] NULL,
    [USER_NAME] [varchar](30) NULL,
    [DATE_TIME] [datetime] NULL,
    [CLICK_COUNT] [int] NULL,
    [LIKES] [int] NULL,
) ON [PRIMARY]
GO

在数据中编写脚本:

INSERT INTO [picture_comment_stats]
    ([PICTURE_STATS_ID]
    ,[USER_NAME]
    ,[DATE_TIME]
    ,[CLICK_COUNT]
    ,[LIKES])
VALUES
    (1 ,'X','2015-05-18',75,18),
    (2 ,'X','2015-05-18',1 ,18),
    (3 ,'X','2015-05-18',42,16),
    (4 ,'X','2015-05-18',59,16),
    (9 ,'X','2015-05-19',34,16),
    (10,'X','2015-05-19',57,14),
    (11,'Y','2015-05-19',11,17),
    (12,'Y','2015-05-19',44,18),
    (17,'Y','2015-05-20',81,11),
    (18,'Y','2015-05-20',29,11),
    (19,'Y','2015-05-20',55,19),
    (21,'Z','2015-05-20',45,16),
    (20,'Y','2015-05-21',20,17),
    (22,'Z','2015-05-21',7 ,18),
    (23,'Z','2015-05-21',30,13),
    (24,'Z','2015-05-21',39,13),
    (25,'Z','2015-05-21',4 ,19),
    (26,'Z','2015-05-21',10,15),
    (27,'Z','2015-05-21',33,13),
    (28,'Z','2015-05-21',23,12),
    (29,'Z','2015-05-21',35,18),
    (30,'Z','2015-05-21',58,19)
GO

表格应该是这样的。

ID USER_NAME DATE_TIME  COMMENT_ID LIKES
-- --------- ---------- ---------- -----
1  X         2015-05-18 75         18   
2  X         2015-05-18 1          18   
3  X         2015-05-18 42         16   
4  X         2015-05-18 59         16   
9  X         2015-05-19 34         16   
10 X         2015-05-19 57         14   
11 Y         2015-05-19 11         17   
12 Y         2015-05-19 44         18   
17 Y         2015-05-20 81         11   
18 Y         2015-05-20 29         11   
19 Y         2015-05-20 55         19   
21 Z         2015-05-20 45         16   
20 Y         2015-05-21 20         17   
22 Z         2015-05-21 7          18   
23 Z         2015-05-21 30         13   
24 Z         2015-05-21 39         13   
25 Z         2015-05-21 4          19   
26 Z         2015-05-21 10         15   
27 Z         2015-05-21 33         13   
28 Z         2015-05-21 23         12   
29 Z         2015-05-21 35         18   
30 Z         2015-05-21 58         19   

我想要做的是对数据进行报告,这样我就有了用户名、图片数和个人图片上的 cmets 数。两个表中的picture_stats_id 实际上是一个外键,它指向表'pictures' 的主键picture_id。我希望能够选择日期或日期范围并使其显示如下的报告:我希望报告会针对不同的 3 天方案显示以下内容

(Filtered for Date:2015-05-18)
USER_NAME PICS COMMENTS
--------- ---- --------
A         10   4

(Filtered for Date:2015-05-19)
USER_NAME PICS COMMENTS
--------- ---- --------
B         10   2

(Filtered for Date:2015-05-20)
USER_NAME PICS COMMENTS
--------- ---- --------
C         10   1

(Filtered for Date:2015-05-18 to 2015-05-19)
USER_NAME PICS COMMENTS
--------- ---- --------
A         10   6
B         10   2

(Filtered for Date:2015-05-19 to 2015-05-20)
USER_NAME PICS COMMENTS
--------- ---- --------
B         10   2
C         10   1

(Filtered for Date:2015-05-18 to 2015-05-20)
USER_NAME PICS COMMENTS
--------- ---- --------
A         10   6
B         10   5
C         10   1

到目前为止,我只有

SELECT ps.USER_NAME as USER_NAME,
    COUNT(*) as PICTURE_COUNT,
    SUM(1) AS COMMENT_COUNT -- can't figure out this statement for nothing.
from picture_comment_stats pcs
RIGHT OUTER JOIN picture_stats ps ON ps.PICTURE_STATS_ID = pcs.PICTURE_STATS_ID
--WHERE ps.DATE_TIME BETWEEN @beginFilterDate AND @endFilterDate
GROUP BY ps.USER_NAME
ORDER BY ps.USER_NAME

编辑

在下面的 cmets 中给出的小提琴地址:http://sqlfiddle.com/#!3/74e77

为了澄清我试图得到的计数。第二列是用户当天发布的图片数量。第三列是仅在指定日期在用户图片上制作了多少 cmets。因此,即使 X 总共对 A 的图片发表了 6 次评论(在 18 日和 19 日),如果我在 18 日过滤,我只想数 4,如果我在 18-19 日过滤,我只想数 6。我敢肯定,这有点难以理解,但这就是我们想要的。

【问题讨论】:

  • 你能为此发布一个 sql fiddle 吗?
  • PICSCOMMENTS 列背后的逻辑是什么?
  • @DeepakPawar 那是我不知道的部分。我只是想计算在给定日期有多少 cmets 附加到图片
  • 脚本中缺少一些左括号和逗号。
  • 这是一个包含所有数据的小提琴:sqlfiddle.com/#!3/8315d,实际上好像我缺少一个表,但您编写的查询使用了其他表而不是您提供的表

标签: sql sql-server count


【解决方案1】:
    SELECT --ps.USER_NAME as USER_NAME,
    s.user_name,
    count(distinct c.comment_id) as comments,
    count(s.picture_stats_id) as pics
    --COUNT(*) as PICTURE_COUNT,
    --SUM(1) AS COMMENT_COUNT
    from --commenting.transcription_audit_stats pcs
   -- RIGHT OUTER JOIN commenting.transcription_stats ps ON ps.SURVEY_STATS_ID --= pcs.SURVEY_STATS_ID 
    picture_stats s
    left join picture_comment_stats c
    on s.picture_stats_id = c.picture_stats_id
    and s.date_time = c.date_time
    where s.date_time between --specified date range
    --WHERE ps.DATE_TIME BETWEEN @beginFilterDate AND @endFilterDate    
    --GROUP BY ps.USER_NAME
    --ORDER BY ps.USER_NAME
    group by s.user_name,s.date_time

试试这个并从您拥有的查找表中获取用户名。还可以过滤您需要的日期。

【讨论】:

  • 虽然很接近,但如果评论是在过滤的日期范围之外进行的,我希望不会在用户图片上找到 cmets。我已经更新了我的问题,希望能更好地反映我在寻找什么。
  • 当我浏览这些值时,我在最后添加了 where 子句。如果你做到了where s.date_time = '2015-05-18' 并将你的结果与我希望在我的帖子中出现的结果进行比较,你会看到不同
  • 最后需要什么? :)
  • 基本上有人说..嘿看看这些数字,他们错了!并指出了一些事情,而不是说“嘿,报告中缺少一些事情”,因为并非所有这些事情的统计数据都已添加到表中(这意味着查询目前是正确的)
猜你喜欢
  • 2017-05-16
  • 1970-01-01
  • 1970-01-01
  • 2021-04-29
  • 2020-03-03
  • 2022-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多