0

単純なテーブルがあるとします。

CREATE TABLE [dbo].[foo](
    [foo_id] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
        [val1_id] [int] NULL,
        [val1_amount] [int] NULL,
        [val2_id] [int] NULL,
        [val2_amount] [int] NULL,
        [val3_id] [int] NULL,
        [val3_amount] [int] NULL,
        [val4_id] [int] NULL
        [val4_amount] [int] NULL,
) ON [PRIMARY]

そして、次のようなテーブルが他にもあります。

CREATE TABLE [dbo].[val](
    [val_id] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
        [amount] [int] NOT NULL,
) ON [PRIMARY]

アプリケーションのユーザーはテーブル val からエントリを選択し、アプリケーションは非決定論的な方法で val?_id と val?_amount に val_id と amount を配置します (はい、これが良くないことはわかっていますが、それに対処する)。

val_id/amount が val?_id/val?_amount 列のいずれかに格納される可能性がある場合、foo テーブルの val_id でグループ化し、foo テーブルの amount 値を合計する出力を生成する方法はありますか? val_id が val1_id に格納されている場合、金額は常にその行内の val1_amount に格納されますが、同じ val_id が別の行の別の val?_id に表示される場合があります (ただし、金額は対応する列に表示されます)。

4

4 に答える 4

6

さて、これを設計した人を叩いた後、列を試してからUNPIVOT、単に結果SUMval_amount列を試すことができます. 私は実際に を使用するつもりはありませんがUNPIVOT、 で同じことをしていCROSS APPLYます:

SELECT x.Val_id, SUM(x.val_amount) Val_Amount
FROM dbo.foo t
CROSS APPLY 
(
    VALUES
        (t.val1_id, t.val1_amount),
        (t.val2_id, t.val2_amount),
        (t.val3_id, t.val3_amount),
        (t.val4_id, t.val4_amount)
) x (Val_id, val_amount)
GROUP BY x.Val_id;

これは、試すためのライブデモを備えた sqlfiddleです。

于 2013-04-22T17:43:35.277 に答える
1

私は COALESCE 関数を使用してそれを行いました。ネストされたクエリを実行する必要がある理由は明確ではありませんが、それ以外の場合は取得できませんでした:

select id, sum(amount)
FROM 
   (SELECT COALESCE(val1_id , val2_id , val3_id , val4_id) id, 
       COALESCE(val1_amount , val2_amount , val3_amount , val4_amount) amount  
    from foo) coalesced_data 
GROUP BY ID

http://sqlfiddle.com/#!3/2ef35/6

于 2013-04-22T17:54:34.227 に答える
0

val_id/amount が val?_id/val?_amount 列のいずれかに格納される可能性がある場合、foo テーブルの val_id でグループ化し、foo テーブルの amount 値を合計する出力を生成する方法はありますか?

地獄は他人のデータです。あなたは次のようなことをするかもしれません:

create view FOO as
select foo.id, val1_id as valueid, val1_amount as amt from T
union all
select foo.id  val2_id as valueid, val2_amount as amt from T
union all
select foo.id  val3_id as valueid, val3_amount as amt from T
union all
select foo.id  val4_id as valueid, val4_amount as amt from T
于 2013-04-22T17:53:51.520 に答える