Sql 按日期获取计数列表
我有两张桌子。包含应用程序列表的程序。还有一个包含每周与之相关的计数。现在,我想得到本周和前一周的应用程序名称和计数。让我解释一下 应用程序: 计数:Sql 按日期获取计数列表,sql,sql-server,Sql,Sql Server,我有两张桌子。包含应用程序列表的程序。还有一个包含每周与之相关的计数。现在,我想得到本周和前一周的应用程序名称和计数。让我解释一下 应用程序: 计数: +----+--------+-------+------------+ | id | app_id | count | date | +----+--------+-------+------------+ | 1 | 1 | 200 | 2016-01-11 | +----+--------+-------+---
+----+--------+-------+------------+
| id | app_id | count | date |
+----+--------+-------+------------+
| 1 | 1 | 200 | 2016-01-11 |
+----+--------+-------+------------+
| 2 | 2 | 500 | 2016-01-11 |
+----+--------+-------+------------+
| 3 | 3 | 750 | 2016-01-11 |
+----+--------+-------+------------+
| 4 | 1 | 180 | 2016-01-18 |
+----+--------+-------+------------+
| 5 | 2 | 378 | 2016-01-18 |
+----+--------+-------+------------+
| 6 | 3 | 1000 | 2016-01-18 |
+----+--------+-------+------------+
这就是我需要的结果。我需要本周和前一周的所有申请:
+-------------+-----------------+-----------------+
| app | count_this_week | count_prev_week |
+-------------+-----------------+-----------------+
| Office 2007 | 180 | 200 |
+-------------+-----------------+-----------------+
| Office 2010 | 378 | 500 |
+-------------+-----------------+-----------------+
| Office 2013 | 1000 | 750 |
+-------------+-----------------+-----------------+
每周运行一个脚本,该脚本填充count
表。现在我还需要每周得到一份报告。
老实说,我有点不知所措,因为我不知道如何声明列的条件。您可以尝试先按
DATEPART(WEEK,C.date),name进行分组,然后使用另一个group by
将计数分成两列。像这样的
SELECT *
FROM count
JOIN app ON app.id=count.app_id
WHERE date BETWEEN '2016-01-18' AND '2016-01-11'
编辑
如果每个应用程序每周正好有一条记录,您只需一条分组即可
SELECT
appname,
SUM(CASE WHEN weekno = 0 THEN sumcount ELSE 0 END) as thisweek,
SUM(CASE WHEN weekno = 1 THEN sumcount ELSE 0 END) as lastweek
FROM
(
SELECT
DATEPART(WEEK,CURRENT_TIMESTAMP) - DATEPART(WEEK,C.date) as weekno,
name as appname,
count as sumcount
FROM App A
INNER JOIN CountTable C ON A.[id] = C.[app_id]
WHERE DATEPART(WEEK,C.date) BETWEEN DATEPART(WEEK,CURRENT_TIMESTAMP) - 1 AND DATEPART(WEEK,CURRENT_TIMESTAMP)
)T
GROUP BY appname
查询
SELECT
appname,
SUM(CASE WHEN weekno = 0 THEN sumcount ELSE 0 END) as thisweek,
SUM(CASE WHEN weekno = 1 THEN sumcount ELSE 0 END) as lastweek
FROM
(
SELECT
DATEPART(WEEK,CURRENT_TIMESTAMP) - DATEPART(WEEK,C.date) as weekno,
name as appname,
SUM(count) as sumcount
FROM App A INNER JOIN CountTable C ON A.[id] = C.[app_id]
WHERE DATEPART(WEEK,C.date) BETWEEN DATEPART(WEEK,CURRENT_TIMESTAMP) - 1 AND DATEPART(WEEK,CURRENT_TIMESTAMP)
GROUP BY DATEPART(WEEK,C.date),name
) AS T
GROUP BY appname
输出
| appname | thisweek | lastweek |
|-------------|----------|----------|
| Office 2007 | 180 | 200 |
| Office 2010 | 378 | 500 |
| Office 2013 | 1000 | 750 |
您可以将此通用查询与当前工作日的变量一起使用:
DECLARE @week date = '2016-01-18';
WITH data AS (
SELECT a.name, c.[count]
, w = CASE WHEN c.[date] = @week THEN 0 ELSE 1 END
FROM @Counts c
INNER JOIN @Apps a ON c.app_id = a.id
WHERE [date] = @week OR [date] = DATEADD(day, -7, @week)
)
SELECT App = name, count_this_week = [0], count_prev_week = [1]
FROM data d
PIVOT (
MAX([count])
FOR w IN ([0], [1])
) p
输出:
App count_this_week count_prev_week
Office 2007 180 200
Office 2010 378 500
Office 2013 1000 750
DECLARE @Apps TABLE ([id] int, [name] varchar(11));
DECLARE @Counts TABLE([id] int, [app_id] int, [count] int, [date] date);
INSERT INTO @Apps([id], [name])
VALUES
(1, 'Office 2007'),
(2, 'Office 2010'),
(3, 'Office 2013')
;
INSERT INTO @Counts([id], [app_id], [count], [date])
VALUES
(1, 1, 200, '2016-01-11'),
(2, 2, 500, '2016-01-11'),
(3, 3, 750, '2016-01-11'),
(4, 1, 180, '2016-01-18'),
(5, 2, 378, '2016-01-18'),
(6, 3, 1000, '2016-01-18')
;
您的数据:
App count_this_week count_prev_week
Office 2007 180 200
Office 2010 378 500
Office 2013 1000 750
DECLARE @Apps TABLE ([id] int, [name] varchar(11));
DECLARE @Counts TABLE([id] int, [app_id] int, [count] int, [date] date);
INSERT INTO @Apps([id], [name])
VALUES
(1, 'Office 2007'),
(2, 'Office 2010'),
(3, 'Office 2013')
;
INSERT INTO @Counts([id], [app_id], [count], [date])
VALUES
(1, 1, 200, '2016-01-11'),
(2, 2, 500, '2016-01-11'),
(3, 3, 750, '2016-01-11'),
(4, 1, 180, '2016-01-18'),
(5, 2, 378, '2016-01-18'),
(6, 3, 1000, '2016-01-18')
;
你是指本月上周还是本年最后一周?前一周。修改后的问题要清楚。你是说前一周吗?上周的意思不同。上周可以是本月的最后一周。首先,您是否有可以使用该存储日期的表?第二,本周计数——如果是星期一,这意味着是星期日和星期一的计数,或者是7天前的计数,上一周是8-14天ago@DMayuri这是语法,但无论如何,让我告诉你,“上周”指的是前一周:“上周”指的是本周之前的日历周。“实际上并不需要总和,因为每周只有一次计数。在这种情况下,您可以不使用初始的分组依据