0

以下のクエリがあります。特定の基準でレコードの数を取得し、cstmr_idでグループ化されたレコードの総数で割ろうとしています。ただし、エラーが発生します。どんな助けでもいただければ幸いです。また、このステートメントはサブクエリであり、より大きな選択クエリの一部です。SQLServer2005を使用しています

「'/'の近くの構文が正しくありません」エラーが発生する

声明:

((SELECT count(*) FROM cstmr WHERE active=1 AND cstmr_type LIKE '%dtr%' 
GROUP BY cstmr_id) 
/  --division sign here. dividing top query by bottom
(SELECT count(*) FROM cstmr WHERE cstmr_type LIKE '%dtr%'
GROUP BY cstmr_id) ) As cstmr_rate

cstmrテーブルのサンプルデータ:

cstmr_id    cstmr_type    active
3423        dtr           1
1236        dtr           1
1842        dtr           1
8273        sys           2
9384        aod           1
3847        sys           2

期待される結果のサンプル:

cstmr_id    cstmr_rate
3423        88.98
1236        25.21
1842        58.01

基本的な擬似コード

タイプが「dtr」のアクティブな顧客のみを選択し、顧客の総数で割ります。次に、個々の顧客ごとにこの導出された比率を表示します。これは非常に基本的な方程式であり、同じテーブル「cstr」を使用します

4

4 に答える 4

3
;WITH x AS 
(
  SELECT cstmr_id, active, c = COUNT(*) 
   FROM dbo.cstmr WHERE cstmr_type LIKE '%dtr%'
   GROUP BY cstmr_id, active
), 
cr(cstmr_id, cstmr_rate) AS
(
  SELECT cstmr_id, 
   SUM(CASE active WHEN 1 THEN c ELSE 0 END)*1.0 / SUM(c) 
  FROM x GROUP BY cstmr_id
)
SELECT cr.cstmr_id, cr.cstmr_rate --, other columns
FROM cr
--INNER JOIN -- other tables from your larger query
于 2012-09-13T18:16:16.167 に答える
2

アウターが欠けているようですSELECT

select -- You are missing this
(
    (SELECT cast(count(*) as decimal(10,2))
    FROM cstmr 
    WHERE active=1 AND cstmr_type LIKE '%dtr%' 
    GROUP BY cstmr_id) 
/  --division sign here. dividing top query by bottom
    (SELECT cast(count(*) as decimal(10,2))
    FROM cstmr 
    WHERE cstmr_type LIKE '%dtr%'
    GROUP BY cstmr_id) 
) As cstmr_rate
于 2012-09-13T17:21:14.833 に答える
1

構文の問題とは別に、必要なものを表現するためのはるかに簡単な方法があります。

select count(distinct case when active = 1 then cstmr_id end)*1.0 / count(distinct cstmr_id)
from cstmr
where cstmr_type like '%dtr%'

cstmr_idがcstmrテーブルで繰り返されていない場合は、次のようにさらに簡略化できます。

select sum(case when active = 1 then 1.0 else 0.0 end) / count(*)
from cstmr
where cstmr_type like '%dtr%'

あるいは:

select avg(active*1.0)
from cstmr
where cstmr_type like '%dtr%'

整数も浮動小数点に変換したことに注意してください。あなたが書いたように、SQL Serverは整数に対して整数演算を行うため、生成される値は0または1のいずれかです。

于 2012-09-13T17:28:24.120 に答える
1

これらの2つのクエリが複数のレコードを返しているため、機能していない可能性があります。SQL Serverは、結果セットを結果セットで除算することはできません。

代わりに、結合を使用してそれらのカウントをプルしてみてください。

編集

このようなもの:

SELECT 
    c.cstmr_id,
    c1/c2 AS 'cstmr_rate'
FROM cstmr as c
JOIN (
    SELECT cstmr_id, count(*) AS 'c1'
    FROM cstmr 
    WHERE active=1 
    AND cstmr_type LIKE '%dtr%' 
    GROUP BY cstmr_id
    ) AS sub1 ON c.cstmr_id = sub1.cstmr_id
JOIN (
    SELECT cstmr_id, count(*) AS 'c2'
    FROM cstmr 
    WHERE cstmr_type LIKE '%dtr%'
    GROUP BY cstmr_id
    ) AS sub2 ON c.cstmr_id = sub2.cstmr_id

EDIT2

アクティブが1または0のいずれかであると仮定すると、これもおそらく機能します。

SELECT
    cstmr_id,
    SUM(Active)/COUNT(*)  AS 'cstmr_rate'
FROM cstmr
GROUP BY cstmr_id
于 2012-09-13T17:50:32.673 に答える