3

クエリによって次のような出力が得られます。

ID      customer_name_Now    customer_name_Before       MOVEMENT
123451  Rustle Bock ltd      N                          £2,121
123451  N                    Rustle Bock ltd           -£25,666,899
123452  Little Garage Ltd    N                          £6,987
123453  N                    The Big Shop               £15,850

話は、私は2ヶ月のデータを持っているということです。どちらの月も、先月の顧客か、現在の顧客かによって、顧客に動きがある場合とない場合があります。多くの場合、両方の月に顧客であるため、上記のような 2 つの行が得られます。

理想的な出力は次のようになります。

ID      customer_name_Now   customer_name_Before      MOVEMENT
123451  Rustle Bock ltd     Rustle Bock ltd          -£25,664,778
123452  Little Garage Ltd   N                         £6,987
123453  N                   The Big Shop              £15,850

したがって、動きを合計して月単位の実際の動きを得る必要があり、顧客が両方の月に関係を持っている場合、顧客の名前は両方の列にある必要があります。

@DMK 初期出力を取得するために使用したクエリは次のとおりです。

select /*+ NO_REWRITE */
customer_id,
customer_name_now,
customer_name_before,
movement

from
    (select /*+ NO_REWRITE */
    main.customer_id,
    main.customer_name_now,
    main.customer_name_before,
    main.limits_before,
    main.limits_now,
    sum(main.limits_now-main.limits_before) as movement

    from
        (select /*+ NO_REWRITE */
        customer_id,
        (customer_name_before) as customer_name_before,
        (customer_name_now) as customer_name_now,
        sum(limits_current) as limits_now,
        sum(limits_previous) as limits_before

        from
             (select /*+ NO_REWRITE */
             sub.customer_id,
             sub.customer_name_now,
             sub.customer_name_before,
             sub.limits_current,
             sub.limits_previous
             from
                 (select /*+ NO_REWRITE */
                 T2.customer_ID,
                 (T2.customer_name) customer_name_now,
                 'N' customer_name_before,

                 sum(T26.AGREED_LIMIT) limits_current,
                 0 limits_previous
                 from 

                 DWH_customer_HISTORY T2,
                 DWH_TIME_DIM T25,
                 DWH_FACILITY_MONTHLY T2
                 where  
                 ---some internal filters are applied here, i habe ot shown coz of security reasons----
                 and 
                 T25.MONTH_END = '2012-11-30' and 

                 group by 
                 T2.customer_ID,
                 T2.customer_name,
                 ) sub

             union all

             select /*+ NO_REWRITE */
             sub.customer_id,
             sub.customer_name_now,
             sub.customer_name_before,
             sub.limits_current,
             sub.limits_previous
             from
                 (select /*+ NO_REWRITE */
                 T2.customer_ID,
                 'N' as customer_name_now,
                 (T2.customer_name)customer_name_before,

                 0 limits_current,
                 sum(T2.AGREED_LIMIT) limits_previous,

                from 
                DWH_customer_HISTORY T2,
                DWH_TIME_DIM T25,
                DWH_FACILITY_MONTHLY T2
                where  
                ---some internal filters are applied here, i habe ot shown coz of security reasons----
                and 
                T25.MONTH_END = '2012-10-31'
                group by 
                T2.customer_ID,
                T2.customer_name,) sub
            ) un
        group by
        customer_id,
        customer_name_now,
        customer_name_before,) main

    group by 
    main.customer_id,
    main.customer_name_now,
    main.customer_name_before,
    main.limits_before,
    main.limits_now)
4

2 に答える 2

1

SQLServer2005+ では OVER 句を使用します

SELECT DISTINCT 
  ID,MAX(customer_name_Now) OVER (PARTITION BY ID) AS customer_name_Now, 
  MAX(customer_name_Before) OVER (PARTITION BY ID) AS customer_name_Before,
  SUM(MOVEMENT) OVER (PARTITION BY ID) AS MOVEMENT 
FROM your_table

また

SELECT ID, MAX(customer_name_Now) AS customer_name_Now,
       MAX(customer_name_Before) AS customer_name_Before,
       SUM(MOVEMENT) AS MOVEMENT
FROM your_table
GROUP BY ID

SQLFiddle のデモ

于 2012-12-20T16:46:08.333 に答える
1

以下のクエリはMySqlでも機能しますが、SqlServerを使用していると想定しています。

Select c1.ID, c1.customer_name_Now, c2.customer_name_Before, Total
from Customers c1
left Join Customers c2 
on c2.ID = c1.ID
left join
    (select ID as ID2, sum(MOVEMENT) as Total, count(*) as Cnt
    from Customers 
    group by ID) t1
on ID2 = c1.ID
where (c1.customer_name_Now <> 'N' and c2.customer_name_Before <> 'N') 
or CNT = 1 

よくわからない場合は、次のデモをご覧ください

SqlFiddle


先ほど追加したクエリを見た後でも、上記は引き続き機能するはずです。あなたはする必要があります

  • 私のテーブルCustomersをあなたのクエリに置き換えてください
  • Customersまたは、結果をクエリから一時テーブルに移動し、私のテーブルを一時テーブルに置き換えます

私は2番目に行きます。同じクエリを再度実行する手間を省きます。

于 2012-12-20T11:25:18.053 に答える