2016-07-21 9 views
-1

私はテーブルを持っており、私は副選択で2つの異なる列を数える必要があります。私はalliasesが副選択では動作しません。しかしDBから2つの副選択のパーセントを取得

januar/februar * 100 

のような何かをする必要があり

SELECT 
    COUNT(z.id_contract) AS countOfContracts, 
    (
     SELECT COUNT(zml.id_contract) FROM [DW].[dbo].[DW_D_CONT] AS zml 
     WHERE zml.p_akt= 'A' 
     AND d_start_dw > '2013-01-01' 
     AND d_start_dw < '2013-01-31' 
    ) AS januar, 
    (
     SELECT COUNT(zml.id_contract) FROM [DW].[dbo].[DW_D_CONT] AS zml 
     WHERE zml.p_akt= 'A' 
     AND d_start_dw > '2013-02-01' 
     AND d_start_dw < '2013-02-28' 
    ) AS februar 
    FROM ... 

:私はこのような何かを持っています。だから私はこのような何かについて考えた:

(
     (SELECT COUNT(zml.id_contract) FROM [DW].[dbo].[DW_D_CONT] AS zml 
     WHERE zml.p_akt= 'A' 
     AND d_start_dw > '2013-01-01' 
     AND d_start_dw < '2013-01-31') 
    ) 
    /
    (
     (SELECT COUNT(zml.id_contract) FROM [DW].[dbo].[DW_D_CONT] AS zml 
     WHERE zml.p_akt= 'A' 
     AND d_start_dw > '2013-02-01' 
     AND d_start_dw < '2013-02-28') 
    ) 

だから私は(あなたが別の日付があります見ることができます)「januar」のカウント数とサブタスクのような「februar」を取得しようとしていますが、私は常に100%を受け取ります。私はまったく確信しています。ジャヌアと熱帯魚の数は違っています。

私を助けることができますか?

答えて

0

(前2008年)、あなたはcteを使用することができますが、SQL Serverの古いバージョンで作業していないと仮定すると:

;WITH cte as 
(
     SELECT 
    COUNT(z.id_contract) AS countOfContracts, 
    (
     SELECT COUNT(zml.id_contract) FROM [DW].[dbo].[DW_D_CONT] AS zml 
     WHERE zml.p_akt= 'A' 
     AND d_start_dw > '2013-01-01' 
     AND d_start_dw < '2013-01-31' 
    ) AS Januar, 
    (
     SELECT COUNT(zml.id_contract) FROM [DW].[dbo].[DW_D_CONT] AS zml 
     WHERE zml.p_akt= 'A' 
     AND d_start_dw > '2013-02-01' 
     AND d_start_dw < '2013-02-28' 
    ) AS Februar 
    FROM ... 
) 

SELECT Januar, Februar, Januar/Februar * 100 
FROM cte 
1

私はOUTER APPLYを使用することをお勧めします:

SELECT COUNT(z.id_contract) AS countOfContracts, 
     months.jan, months.feb, months.jan/months.feb 
FROM ... OUTER APPLY 
    (SELECT SUM(CASE WHEN d_start_dw > '2013-01-01' AND d_start_dw < '2013-01-31' 
        THEN 1.0 ELSE 0 
       END) as jan, 
      SUM(CASE WHEN d_start_dw > '2013-02-01' AND d_start_dw < '2013-02-28' 
        THEN 1.0 ELSE 0 
       END) as feb 
    FROM [DW].[dbo].[DW_D_CONT] AS zml 
    WHERE zml.p_akt = 'A' 
    ) months; 

これは、あなたが可能にすべての月を1つのサブクエリに集約します。これは、毎月の別のサブクエリよりも効率的でなければなりません。

また、日付計算を確認する必要があります。今月の最初と最後の日を除外する理由はわかりません。

+0

私の問題は、これらの2つの副選択の分割です。私は常に1(100%を意味する)を受け取ります。しかし、1月のカウントは2月と同じではありません。私はそれが可能であるか分からない:( – MegoSoft

+0

@MegoSoft ... SQL Serverは整数除算を行うので、値を浮動小数点/ 10進表現に変更する必要があります。これを修正してください。 –

0

そうのように、サブクエリを使用せずにこれを行うことが可能であるべきである:

select 
    count(case when p_akt = 'A' then id_contract end) as total_count, 
    count(
     case when p_akt = 'A' and d_start_dw > '2013-01-01' and d_start_dw <= '2013-01-31' 
      then id_contract 
     end 
    ) as januar_count, 
    count(
     case when p_akt = 'A' and d_start_dw > '2013-02-01' and d_start_dw <= '2013-02-28' 
      then id_contract 
     end 
    ) as februar_count 
from 
    [DW].[dbo].[DW_D_CONT] 

それは可能な限りサブクエリを使用しないように、一般的には良いアイデアです。

0

これは、任意のMS SQLバージョンで動作するはずです。

SELECT 
    COUNT(z.id_contract) AS countOfContracts, 
    COUNT(CASE WHEN d_start_dw > '2013-01-01' AND d_start_dw < '2013-01-31' 
     THEN zml.id_contract END) AS januar, 
    COUNT(CASE WHEN d_start_dw > '2013-02-01' AND d_start_dw < '2013-02-28' 
     THEN zml.id_contract END) AS februar 
FROM ..