3

Salesというテーブルがあります。

id_sale  id_ticket  total  state
-------  ---------  -----  -----
100      100        30     inactive    
101      101        30     active    
102      101        60     active    
103      102        30     active    
104      102        30     active    
105      103        10     active    
106      103        5      active    

私が必要としているのはtotal、状態がアクティブなときに列の合計、sum(total)を取得し、それをxパーセントで乗算することです(私はそれを行うことができます)。合計されたチケット)は<= sum(total) * x percentage、別のテーブルにコピーします(同じ値)

したがって、チケット101の合計=90およびチケット102の合計=60およびチケット103の合計=15であり、sum(total)*xパーセンテージ=160の場合、クエリはからのすべての情報のみを返します。チケット101と102。

午前中読んで、私はどういうわけか私が必要とするもののような何かをするが、id_ticketではなくid_Salesを使用するコードを見つけました:

    select t1.id_sale, t1.total, SUM(t2.total) as sum
    from sales t1
    inner join sales t2 on t1.id_sale >= t2.id_sale
    where t2.state='active'
    group by t1.id_sale, t1.total
    having sum(t2.total)<=(
                           select sum(total)*.65
                           from sales
                           where state='active')
    order by t1.id_sale

私が受け取ると思うのは:

id_sale  id_ticket  total  state
-------  ---------  -----  ----- 
101      101        30     active    
102      101        60     active    
103      102        30     active    
104      102        30     active

チケット101とチケット102の合計が<=sum(total)*xである場合

したがって、101と102の合計= 150およびsum(total)* x = 160(たとえば)

必要なことを実行するにはどうすればよいですか、またはこのコードを編集して、探していることを実行するにはどうすればよいですか。

4

2 に答える 2

1

次のようなものから始めることができます。

WITH grouped_and_ranked AS (
  SELECT
    id_ticket,
    ticket_total = SUM(total),
    grand_total = SUM(SUM(total)) OVER (),
    ticket_rnk = ROW_NUMBER() OVER (ORDER BY id_ticket)
  FROM sales
  WHERE state = 'active'
  GROUP BY id_ticket
),
cumulative AS (
  SELECT
    id_ticket,
    ticket_total,
    grand_total,
    ticket_rnk,
    total_so_far = ticket_total
  FROM grouped_and_ranked
  WHERE ticket_rnk = 1
  UNION ALL
  SELECT
    r.id_ticket,
    r.ticket_total,
    r.grand_total,
    r.ticket_rnk,
    total_so_far = c.total_so_far + r.ticket_total 
  FROM grouped_and_ranked r
    INNER JOIN cumulative c ON r.ticket_rnk = c.ticket_rnk + 1
  WHERE r.ticket_total columns
)
SELECT
  s.id_sale,
  s.id_ticket,
  s.total,
  s.state
FROM sales s
INNER JOIN cumulative c ON s.id_ticket = c.id_ticket
;

最初のCTEgrouped_and_ranked、アクティブな売上を取得し、チケットごとの合計と総計(windowed SUM()を使用)を計算します。また、後で累計を計算するときに使用するチケットにランキング番号を割り当てます。

次のCTEcumulativeは、再帰CTEです。@percent累計が指定された総計の年齢以下である限り、前の結果セットから行を取得します。

メインのSELECTは、最終的なチケットリストを使用して、リストをsalesテーブルに結合し直すことにより、詳細行を取得します。

このクエリはSQLFiddleでテストできます。

于 2012-07-23T22:47:40.220 に答える
1

これは、再帰なしで、ウィンドウ関数のみを使用して比較的簡単に実行できます。

select id_sale, id_ticket, total, state
from (
  select
    id_sale, id_ticket, total, state,

    -- Now we can calculate the cumulative percentage easily
    sum(sum_per_ticket) over (order by id_sale) / sum(sum_per_ticket) over () percentage
  from (
    select
      id_sale, id_ticket, total, state,

      -- Calculate the sum per ticket and place it only on the first row per id_ticket
      -- Fill the other rows with nulls.
      case when id_sale = 
                first_value(id_sale) over (partition by id_ticket order by id_sale) 
           then sum(total) over (partition by id_ticket) end sum_per_ticket
    from sales
    where state = 'active'
  ) t
) t
where percentage <= 0.65
order by id_sale

累積パーセンテージの計算については、ここで詳しくブログに書いています

于 2019-02-14T15:45:20.800 に答える