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这是语法,但无论如何,让我告诉你,“上周”指的是前一周:“上周”指的是本周之前的日历周。“实际上并不需要
总和,因为每周只有一次计数。在这种情况下,您可以不使用初始的
分组依据