2013-07-31 11 views
8

を取得:SELECTでGROUP BYでCASEを使用するSQL。 CASE-値を必要とするが、そうbasicially 1つの質問1つの問題がある行の値

1.質問 - 私は、テーブルに100列のように持っている(とどのキーまたはuindexが設定されていない)と、私はそのテーブルに参加するか、そのテーブルをサブセレクションしたいのですが、実際にはすべてのカラム名を書き出す必要がありますか?

2.問題は - 以下の例では、1質問を示して、私の実際のSQL文の問題

例:

A.FIELD1, 
(SELECT CASE WHEN B.FIELD2 = 1 THEN B.FIELD3 ELSE null FROM TABLE B WHERE A.* = B.*) AS CASEFIELD1 
(SELECT CASE WHEN B.FIELD2 = 2 THEN B.FIELD4 ELSE null FROM TABLE B WHERE A.* = B.*) AS CASEFIELD2 
FROM TABLE A 
GROUP BY A.FIELD1 

話がある:私はCASEを入れていない場合それ自身のSELECT文には、実際のrownameをGROUP BYに入れなければならず、GROUP BYはNULL値をCASEからグループ化せず、行の実際の値をグループ化します。そのため、キーとuindexがないか、何らかの形で別の解決策が見つかるため、すべての列に結合するかsubselectする必要があります。

DBServerはDB2です。

これで言葉だけで、SQLはありません: 私は "ZD"と "EK"(1 = ZD、2 = EK)に分けることができる "ディストリビューター "。 「注文アイテム」には2つの異なる「departements」(ZD、EK)のうちの1つを持つことができますが、「ZD」と「EK」のフィールド/行は常に両方の値が入ります。私は "departement"を考慮するグループ分けが必要で、指定された "departement"(ZDまたはEK)が変化している場合にのみ、新しいグループを作成したい。

SELECT 
(CASE WHEN TABLE.DEPARTEMENT = 1 THEN TABLE.ZD ELSE null END) AS ZD, 
(CASE WHEN TABLE.DEPARTEMENT = 2 THEN TABLE.EK ELSE null END) AS EK, 
TABLE.DISTRIBUTOR, 
sum(TABLE.SOMETHING) AS SOMETHING, 
FROM TABLE 
GROUP BY 
ZD 
EK 
TABLE.DISTRIBUTOR 
TABLE.DEPARTEMENT 

ここでは、GROUP BYのSELECTとZD、EKで動作します。問題は、たとえEKが指定されたDEPARTEMENTではなかったとしても、既に変更されていれば新しいグループを開きました。なぜなら、すでに上に説明していたので、CASEのNULLではなく実際のEK値を使用していたからです。

+0

のようなものを解決する傾向があるかもしれないあなたは同じで表Bの列にテーブルAの各列の値を確認する意味でください列名、およびすべての列が一致する必要がありますか?それとも他のタイプのロジックを意味しますか? – WarrenT

+0

正確には、しかしそれはちょっとした問題ですが、実際の問題ではありません。私は、近い将来にそれをさらに詳しく説明します。 – Khazar

答えて

6

そして、ここの女性と紳士は、問題を解決する:

t-clausen.dk @
SELECT 
(CASE WHEN TABLE.DEPARTEMENT = 1 THEN TABLE.ZD ELSE null END) AS ZD, 
(CASE WHEN TABLE.DEPARTEMENT = 2 THEN TABLE.EK ELSE null END) AS EK, 
TABLE.DISTRIBUTOR, 
sum(TABLE.SOMETHING) AS SOMETHING, 
FROM TABLE 
GROUP BY 
(CASE WHEN TABLE.DEPARTEMENT = 1 THEN TABLE.ZD ELSE null END), 
(CASE WHEN TABLE.DEPARTEMENT = 2 THEN TABLE.EK ELSE null END), 
TABLE.DISTRIBUTOR, 
TABLE.DEPARTEMENT 

:ありがとうございます!

@others:...

1

いいえ、ワイルドカード平等テストはありません。あなたは、個別にテストしたいすべてのフィールドをリストアップする必要があります。個々のフィールドをテストしたくない場合は、すべてのフィールドを連結するなどのハッキングを使用できます。

WHERE (a.foo + a.bar + a.baz) = (b.foo + b.bar + b.az) 

いずれにせよ、すべてのフィールドをリストしています。

+1

"+"は連結演算子ではありません。数値以外の列があると、この例は失敗します。適切な連結を使用しても、多くの場合正しく機能しません。たとえば ''a' ||ヌル|| 'c''と ''a' || 'b' || NULLは両方ともNULLを返しますが、明らかにこれらの組み合わせを異なるものとして扱うことになります。一方、1つのNULL値は別のNULL値と等しくないので、 ''a' ||ヌル|| 'c''と ''a' ||ヌル|| 'c' 'も同じではありませんが、この場合の意図はそれらを等しく扱うことです。 – mustaccio

+0

SQL標準体で怒鳴り、標準的な演算子で解決するように指示してください。 –

+0

あなた自身を欲しがる人は誰でも叫んでください。 ANSI SQL標準では、連結演算子として二重垂直バーが明確に指定されています。 – mustaccio

2

実際にワイルドカード平等テストがあります。 フィールド1でグループ化する理由がわかりません。あなたの例では不可能に思えるでしょう。私は、あなたの質問にそれを合わせてみました:

SELECT FIELD1, 
CASE WHEN FIELD2 = 1 THEN FIELD3 END AS CASEFIELD1, 
CASE WHEN FIELD2 = 2 THEN FIELD4 END AS CASEFIELD2 
FROM 
(
SELECT * FROM A 
INTERSECT 
SELECT * FROM B 
) C 
UNION -- results in a distinct 
SELECT 
A.FIELD1, 
null, 
null 
FROM 
(
SELECT * FROM A 
EXCEPT 
SELECT * FROM B 
) C 

これは

+0

これは私の質問に対する良い答えですが、このような不安定な方法でしか可能ではありませんが、悲しいです。今問題を解決する必要があるだけです。 – Khazar

+0

@Khazarはいそれは非常に複雑です。しかし可能性があることを実証したかっただけです –

0

あなたがテーブルBに一致するテーブルAのすべての行を検索する必要がある場合には比較できないデータ型、どのようにINTERSECT程度またはDISTINCT INTERSECTのために失敗しますか?あなたが唯一の行全体がBからの行の値と一致したAから行をしたい場合

select * from A 
INTERSECT DISTINCT 
select * from B 

しかし、その後、なぜあなたのサンプルコードでは、BからAと他人からいくつかの値を取るのでしょうか?行がすべての列で一致すると、それは無意味に見えます。 (おそらくあなたの質問はもう少し詳しく説明できますか?)

+0

問題はGROUP BYとCASEにあります。 CASEの値が必要ですが、サブセレクトを使用しない限り、FIELD3、FIELD4、およびフィルタリングされていない値をグループ化しないため、エイリアスを使用できません。ですから、副選択は通常無意味ですが、この場合はそうではありません。 – Khazar

+0

CASEロジックとマッチングロジックで何が必要なのか(ただしこれに限定されません)を含む英語の要件を説明してください。今のところSQLをそのままにしておいてください。私たちは、何をする必要があるかを明確かつ明白に理解したら、 – WarrenT

+0

@ t-clausen申し訳ありませんが、なぜ私は私の答えを見ていないのか分かりません。 – WarrenT

1

私はそれをこの

WITH q as 
(SELECT 
     Department 
    , (CASE WHEN DEPARTEMENT = 1 THEN ZD 
      WHEN DEPARTEMENT = 2 THEN EK 
            ELSE null 
     END) AS GRP 
    , DISTRIBUTOR 
    , SOMETHING 
    FROM mytable 
) 
SELECT 
     Department 
    , Grp 
    , Distributor 

    , sum(SOMETHING) AS SumTHING 
    FROM q 
GROUP BY 
     DEPARTEMENT 
    , GRP 
    , DISTRIBUTOR 
関連する問題