4

SUM(Values)各Acctの を取得しようとしていますが、私の問題はDISTINCTSUM(Values).

たとえば、いくつかのサンプルデータがあります。

Acct         Values    Name       Street     
123456789    100.20    John       66 Main Street
123456789    200.80    John       22 Main Avenue
222222222    50.25     Jane       1 Blvd
333333333    25.00     Joe        55 Test Ave
333333333    50.00     Joe        8 Douglas Road
555555555    75.00     Tim        12 Clark Ave
666666666    500.00    Tim        12 Clark Street
666666666    500.00    Tim        3 Main Rd.

私のクエリは次のもので構成されていました:

SELECT DISTINCT Acct, SUM(Value) AS [TOTAL]
FROM TABLE_NAME
GROUP BY Acct

上記のクエリにより、必要なものに近づくことができますが、行全体が必要です。

私が探しているものの下の例:

Acct         Total      Name       Addr1     
123456789    301.00     John       66 Main Street 
222222222    50.25      Jane       1 Blvd
333333333    75.00      Joe        55 Test Ave
555555555    75.00      Tim        12 Clark Ave
666666666    1000.00    Tim        12 Clark Street

ありがとう。

4

3 に答える 3

4

返されるアドレスが重要でない場合は、他の列に適用して集計できます。

SELECT Acct, 
  SUM(Value) AS [TOTAL], 
  max(name) name, 
  max(Street) addr1
FROM TABLE_NAME
GROUP BY Acct;

デモで SQL Fiddle を参照してください

于 2013-05-10T20:03:34.140 に答える
4

row_number()これは、ほとんどのデータベースのようなウィンドウ関数を使用して行うことができます。

select acct, total, name, addr1
from (select t.*, row_number() over (partition by acct order by acct) as seqnum,
             sum(value) over (partition by acct) as Total
      from table_name
     ) t
where seqnum = 1;
于 2013-05-10T20:03:40.197 に答える
3

これを解決するには、ウィンドウ関数 (OVER 句) を使用します。

SELECT DISTINCT 
   Acct
  ,SUM([Values]) OVER (PARTITION BY Acct) AS 'Total'
  ,Name
  ,FIRST_VALUE(Street) OVER (PARTITION BY Acct ORDER BY Street DESC) AS 'Addr1'
  FROM TABLE_NAME
;

ウィンドウ関数の良いところは、関数で必要のないもの (SUM など) をグループ化に追加せずに、探しているものを記述することに集中できることです。

上記の SQL では、Acct (または OVER 句で呼び出される場合は PARTITION BY) によってグループ化された値の SUM が必要であると言っています。FIRST_VALUE を使用すると、番地の最初の値を返すことができます。同じものには DATETIME 列がなかったので、最初の値の順序を言うのは難しいです。LAST_VALUE ウィンドウ関数もあります。DATETIME 列があると仮定すると、その列の値を ORDER BY したいでしょう。そうでない場合は、Street で行ったように値を選択するだけです (MAX も良いオプションかもしれませんが、DATETIME 値のいくつかのタイプを持つことはそれを行う最良の方法)。

この SQL Fiddle をチェックしてください: http://sqlfiddle.com/#!6/a474c/8

OVER 句を使用した SUM に関する BOL は次のとおりです: http://msdn.microsoft.com/en-us/library/ms187810.aspx

FIRST_VALUE の詳細はこちら: http://blog.sqlauthority.com/2011/11/09/sql-server-introduction-to-first-_value-and-last_value-analytic-functions-introduced-in-sql-server -2012/

これは、ウィンドウ関数について行ったブログ投稿です: http://comp-phil.blogspot.com/2013/03/higher-order-functions.html

于 2013-05-10T21:12:20.123 に答える