簡體   English   中英

sql獨特+計數

[英]sql distinct + count

我要做的是為每個用戶計算同一列的特定實例。

例:
vagt_type的“ timeloen”值可能是該用戶的10倍,其中usr = 1 ,而“ prov”的值是該用戶的2倍。 我需要在單獨的列中計數,而我使用DISTINCT只能使每個usr一次。

下面是我到目前為止已經制定了,但是,計數的所有實例vagt_type ,由於某種原因沒有受到cast從日期到日期:

$test = $wpdb->get_results("SELECT distinct m.usr, CONCAT(n1.meta_value, ' ', n2.meta_value) AS fl_name, count(m1.vagt_type) as timeloen
FROM $main_table as m
LEFT JOIN Lausten_usermeta n1 ON m.usr=n1.user_id and n1.meta_key = 'first_name'
LEFT JOIN Lausten_usermeta n2 ON m.usr=n2.user_id and n2.meta_key = 'last_name'
LEFT JOIN $main_table m1 ON m.usr=m1.usr and m1.vagt_type = 'timeloen'
WHERE m.vagtDato BETWEEN CAST('$start' AS DATE) AND CAST('$end' AS DATE)
", ARRAY_A);

編輯:我的表的示例:

 id | usr | vagtDato   |  vagt_type
 13 |   1 | 2015-09-05 |    kursus
 16 |   1 | 2015-09-01 |    kursus
 11 |   1 | 2015-09-03 |    trappetur
 10 |   1 | 2015-09-02 |    provision
 9  |   1 | 2015-09-01 |    timeloen    
 15 |   1 | 2015-09-04 |    sygedag
 17 |   1 | 2015-09-02 |    timeloen    
 18 |   29| 2015-09-18 |    timeloen    
 19 |   1 | 2015-10-01 |    timeloen    

其他表存在的僅僅是join到用戶表及其在這種情況下並不重要,我只用它來CONCAT用戶的全名。

預期成績:

usr | timeloen | provision | sygedag
1   | 3        | 1         | 1
29  | 1        | 0         | 0

編輯:-希望這對其他人有幫助:)最終成為我的整體解決方案:

$test = $wpdb->get_results("SELECT a.usr, a.vagtDato, b.timeloen, c.provision, d.kursus, e.trappetur, f.sygedag
FROM $main_table a
LEFT JOIN (SELECT usr, count(vagt_type) as timeloen
FROM $main_table  WHERE vagt_type = 'timeloen'
AND vagtDato between DATE('$start') AND DATE('$end')
GROUP BY usr ) b on b.usr=a.usr

LEFT JOIN (SELECT usr, count(vagt_type) as provision
FROM $main_table  WHERE vagt_type = 'provision'
AND vagtDato between DATE('$start') AND DATE('$end')
GROUP BY usr ) c on c.usr=a.usr

LEFT JOIN (SELECT usr, count(vagt_type) as kursus
FROM $main_table  WHERE vagt_type = 'kursus'
AND vagtDato between DATE('$start') AND DATE('$end')
GROUP BY usr ) d on d.usr=a.usr

LEFT JOIN (SELECT usr, count(vagt_type) as trappetur
FROM $main_table  WHERE vagt_type = 'trappetur'
AND vagtDato between DATE('$start') AND DATE('$end')
GROUP BY usr ) e on e.usr=a.usr

LEFT JOIN (SELECT usr, count(vagt_type) as sygedag
FROM $main_table  WHERE vagt_type = 'sygedag'
AND vagtDato between DATE('$start') AND DATE('$end')
GROUP BY usr ) f on f.usr=a.usr

WHERE a.vagtDato between DATE('$start') AND DATE('$end')
GROUP BY a.usr
", ARRAY_A);

我相信您必須輸入以下內容:

SELECT
    usr
    , ( SELECT( count( * ) FROM $TABLE where vagt_type = 'timeloen' ) AS timeloen
    , ( SELECT( count( * ) FROM $TABLE where vagt_type = 'provision ' ) AS provision 
    , ( SELECT( count( * ) FROM $TABLE where vagt_type = 'sygedag' ) AS sygedag
FROM ( $main_table )
    ( $LEFTJOINS )
GROUP BY usr --to get the distincts users

要么

SELECT
    usr
    , count( * )
FROM ( $main_table )
    ( $LEFTJOINS )
GROUP BY 1, 2 --to get the distincts users

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM