2017-02-11 5 views
0

私は2 CTEを持っています。最初のユーザーはユーザー数をカウントします。 2つ目は同じことをします。それらの比率を計算する必要があります。CTEからのユーザーの割合を計算する

どのようにすることができますか?最小限の変更で

WITH count AS (SELECT user_id 
         from users u 
          where u.status = 'Over'), 
users as (Select user_id 
       from users u 
        where u.status LIKE 'LR' 
        and user_id IN (select * from count)) 
Select COUNT(*) From users 


WITH count AS (SELECT user_id 
         from users u 
          where u.description = 'Track'), 
users as (Select user_id 
       from from users u 
        where u.status NOT LIKE 'LR' 
        and user_id IN (select * from count)) 
Select COUNT(*) From users 
+0

比以上とトラックの間に2つのカウントの選択の簡単な? – McNets

+0

cteユーザーとカウントの間。また、トラックとそれ以上の間。しかし、ユーザーとユーザーの間でカウントする主なものは、cteとcteです。私はカウントとユーザーの間の例を私に設定すれば、トラックとカウントを数えることができると思います。 CTEのいずれかのカップル – Kirill

答えて

1

、あなただけの1より大きなCTE行うことができます。

WITH count_1 AS 
( 
    SELECT user_id 
    FROM users u 
    WHERE u.status = 'Over' 
), 
users_1 AS 
(
    SELECT user_id 
    FROM users u 
    WHERE u.status LIKE 'LR' 
     AND user_id IN (SELECT user_id FROM count_1) 
), 
count_2 AS 
( 
    SELECT user_id 
    FROM users u 
    WHERE u.description = 'Track' 
), 
users_2 AS 
(
    SELECT user_id 
    FROM users u 
    WHERE u.status NOT LIKE 'LR' 
        AND user_id IN (select user_id from count_2) 
) 
SELECT 
    CAST((SELECT count(*) FROM users_1) AS FLOAT)/
    (SELECT count(*) FROM users_2) AS ratio 

を注1:クエリはどんな意味がありませんので、私はいくつかのスペルミスがあると推測し、または一部の列が台無しアップ。 count_1はstatus = 'Over'のユーザーを選択し、users_1はstatus = 'LR'(結果はすでにゼロ)のものを選択します。

注2:あなたは、クエリをこのようにすることはないだろう...次のクエリはまったく同じ意味し、はるかに簡単である(そして速い):

WITH 
count_1 AS 
( 
    SELECT count(user_id) AS c 
    FROM users u 
    WHERE  u.description = 'Over' 
     AND u.status = 'LR' 
), 
count_2 AS 
( 
    SELECT count(user_id) AS c 
    FROM users u 
    WHERE  u.description = 'Track' 
     AND u.status <> 'LR' 
) 
SELECT 
    (count_1.c + 0.0)/count_2.c AS ratio 
FROM 
    count_1, count_2 ; 
+0

ありがとう!しかし、私はこの考え方を考えています。SELECT CAST((SELECT count(*)FROM users_1)AS float)/ (SELECT count(*)FROM users_2)AS比率はパーセントでは当てはまりません(最初のCTEでは9361行2番目の1855行ですが、結果は5%です( – Kirill

+0

この結果のパーセントは19,8ですが、結果は5です。@joanolo – Kirill

+0

%の場合、* 100.0になる必要があります。 – joanolo

2

は、あなただけの、CTEせずにそれを行うことができます

SELECT count(CASE WHEN description = 'Over' AND status LIKE 'LR' THEN 1 END) 
    /
     count(CASE WHEN description = 'Track' AND status NOT LIKE 'LR' THEN 1 END)  
     As Ratio 
FROM users 
+0

ええ、 'NOT LIKE 'LR' 'LR' – Andomar

0

さらに別バージョン:

SELECT count(*) FILTER (WHERE description = 'Over' AND status LIKE 'LR') 
    /
     count(*) FILTER (WHERE description = 'Track' AND status NOT LIKE 'LR')  
     As Ratio 
FROM users 
関連する問題