2017-02-11 73 views
1

我有一个表projects,用户可以输入新的项目,并在用户和DATE_ADDED记录(字段)获取的记录为分组时序编号:从数据库

|----|------------|--------------| 
| id | user_added | date_added | 
|----|------------|--------------| 
| 1 | 'person 1' | '2017-01-05' | 
| 2 | 'person 2' | '2017-02-10' | 
| 3 | 'person 3' | '2017-02-23' | 
| 4 | 'person 1' | '2017-03-04' | 
| 5 | 'person 3' | '2017-03-31' | 
|----|------------|--------------| 

我不知道是否和我如何获得每个月添加项目的用户分组的项目数量。上表的预期输出:

|------------|---------|---------|---------|-----| 
| user_added | 2017-01 | 2017-02 | 2017-03 | etc.| 
|------------|---------|---------|---------|-----| 
| 'person 1' | 1 | 0 | 1 | ... | 
| 'person 2' | 0 | 1 | 0 | ... | 
| 'person 3' | 0 | 1 | 1 | ... | 
|------------|---------|---------|---------|-----| 

回答

0

不要将值放入列中。 SQL方式是每人每月一行:

select user_added, strftime(date_added, '%Y-%m') as yyyymm, count(*) 
from t 
group by user_added, strftime(date_added, '%Y-%m') 
order by 1, 2; 

这是返回结果的SQLish方法。您可以在应用程序中透视这些值。

摆在SQL中的问题是你无法处理任意数量的月份。 SQL查询返回固定数量的列,其名称必须在查询中指定。

0

您可以使用聚集做这样的摆动只要你有年月事先知道:

select user_added, 
    count(case 
      when ym = '2017-01' 
       then 1 
      end) "2017-01", 
    count(case 
      when ym = '2017-02' 
       then 1 
      end) "2017-02", 
    count(case 
      when ym = '2017-03' 
       then 1 
      end) "2017-03", 
    . . . 
from (
    select user_added, 
     strftime(date_added, '%Y-%m') ym 
    from your_table 
    ) t 
group by user_added; 

如果没有,那么保持年月单柱连同它的Count为每个用户:

select user_added, 
    ym, 
    count(*) 
from (
    select user_added, 
     strftime(date_added, '%Y-%m') ym 
    from your_table 
    ) t 
group by user_added, 
    ym; 
0

正如Gordon Linoff所说 - 只有在数据库中有固定数量的可能值时,才可以在数据库中进行调整 - 在您的情况下为年份组合。

如果你坚持你的3年个月的值,它会像这样(是的,你需要的硬线年月值代入列名):

WITH 
-- input 
projects(id,user_added,date_added) AS (
      SELECT 1 , 'person 1' , DATE '2017-01-05' 
UNION ALL SELECT 2 , 'person 2' , DATE '2017-02-10' 
UNION ALL SELECT 3 , 'person 3' , DATE '2017-02-23' 
UNION ALL SELECT 4 , 'person 1' , DATE '2017-03-04' 
UNION ALL SELECT 5 , 'person 3' , DATE '2017-03-31' 
) 
, 
-- vertical display 
vertical_grouped AS (
SELECT 
    user_added 
, strftime(date_added,'%Y-%M') AS yearmonth 
, COUNT(*)      AS projcount 
FROM projects 
GROUP BY 
    user_added 
, strftime(date_added,'%Y-%M') 
) 
SELECT 
    user_added 
, IFNULL(SUM(CASE yearmonth WHEN '2017-01' THEN projcount END),0) AS "2017-01" 
, IFNULL(SUM(CASE yearmonth WHEN '2017-02' THEN projcount END),0) AS "2017-02" 
, IFNULL(SUM(CASE yearmonth WHEN '2017-03' THEN projcount END),0) AS "2017-03" 
FROM vertical_grouped 
GROUP BY 
    user_added 
; 

user_added|2017-01|2017-02|2017-03 
person 1 |  1|  0|  1 
person 2 |  0|  1|  0 
person 3 |  0|  1|  1