2

これが裏話です。

特定の人の正しいコミッション値を含むトランザクションのリストを生成しようとしています。すべての人がコミッションの対象となるわけではありませんが、コミッション テーブルにエントリがあり、どの請求書アイテム、アイテム サブクラス、アイテム クラス、および/またはデフォルトのコミッション値を獲得するかを指定します。

私の問題は、以下に示すように、選択を非常に困難にするコミッションテーブルの作成方法にあります。

コミッション表

staffid sequence invoiceitemid subclassid invclassid commission commtype 
------- -------- ------------- ---------- ---------- ---------- -------- 
KH      1        (null)        (null)     (null)     20.0       1        
KH      2        (null)        (null)     BOA        0.0        2        
KH      3        (null)        (null)     GRO        0.0        2        
KH      4        (null)        (null)     HEA        5.0        2        
KH      5        (null)        (null)     FTP        5.0        2        
KH      6        (null)        (null)     NTR        0.0        2        
KH      7        (null)        EUK        NTR        5.0        2        
KH      8        (null)        FOP        NTR        5.0        2        
KH      9        (null)        PUR        NTR        5.0        2        
KH      10       (null)        RC         NTR        5.0        2        
KH      11       (null)        (null)     MSC        0.0        2        
KH      12       (null)        (null)     MIS        0.0        2        
KH      13       1171          (null)     (null)     15.8       2        
KH      14       1173          (null)     (null)     15.2       2        



ここでも、COMMISSION テーブルの最も具体的な列から最も具体的でない列に基づいて、トランザクションごとに 1 つのコミッション値のみを選択する必要があります。

最も具体的-invoiceitemid、subclassid、invclassid -最も具体的でない

例 1:
トランザクションに以下が含まれている場合:

  • 請求書アイテムミッド: 1234
  • サブクラス ID: FOP
  • invclass: NTR

SQL はサブクラス ID (「FOP」) で一致し、invclass (「NTR」) では一致しないため、手数料は 0.0 ではなく 5.0 になります。

例 2: トランザクションに一致が含まれていない場合:

  • 請求書アイテムミッド: 1234
  • サブクラス ID: STR
  • invclass: BLA

SQL は、invoiceitemid (null)、subclassid (null)、および invclass (null) で一致する必要があり、その結果、手数料は 20.0 になります。

私が試したこと COALESCE(invoiceitemid, subclassid, invclassid) を使用して、そのレコードで最も具体的な項目を含む列を作成します。

ただし、最初の例では、表の FOP の前に NTR が発生するため、最初に誤って一致します。(下記参照)

SELECT COALESCE(invoiceitemid, subclassid, invclassid) AS COMBINE, * 
FROM stcomm
WHERE staffid = 'KH'
ORDER BY sequence DESC

COMBINE staffid sequence invoiceitemid subclassid invclassid commission commtype 
------- ------- -------- ------------- ---------- ---------- ---------- -------- 
URN     KH      28       (null)        URN        MSC        0.0        2        
6326    KH      27       6326          (null)     (null)     0.0        2        
6325    KH      26       6325          (null)     (null)     0.0        2        
6324    KH      25       6324          (null)     (null)     0.0        2        
6328    KH      24       6328          (null)     (null)     0.0        2        
5671    KH      23       5671          (null)     (null)     20.0       2        
5793    KH      22       5793          (null)     (null)     20.0       2        
4263    KH      21       4263          (null)     (null)     0.0        2        
5081    KH      20       5081          (null)     (null)     20.0       2        
3759    KH      19       3759          (null)     (null)     0.0        2        
4846    KH      18       4846          (null)     (null)     0.0        2        
SUH     KH      17       (null)        SUH        SUP        5.0        2        
SUD     KH      16       (null)        SUD        SUP        5.0        2        
SUP     KH      15       (null)        (null)     SUP        0.0        2        
1173    KH      14       1173          (null)     (null)     15.2       2        
1171    KH      13       1171          (null)     (null)     15.8       2 


この問題を解決するために、最も具体的な「FOP」が最初に選択されるように、シーケンス フィールドを降順で並べました。これは機能します。

COMMISSION テーブルをクエリして、トランザクションの正しい手数料を表示するにはどうすればよいですか?

私のトランザクションのSQLは次のとおりです。

SELECT T.staffid, T.invoiceid, T.invoiceitemid, I.subclassid, I.classid, T.quantity, T.invoiceprice
FROM TRANSACT T, INVOITEM I
WHERE T.invoiceitemid = I.invoiceitemid
AND T.staffid = 'KH'

staffid invoiceid invoiceitemid subclassid classid quantity invoiceprice 
------- --------- ------------- ---------- ------- -------- ------------ 
KH      2555.0    04000         FOP        NTR     2.00     3.40         
KH      3575.0    04000         FOP        NTR     7.00     11.90        
KH      3981.0    04000         FOP        NTR     6.00     10.20        
KH      4333.0    04000         FOP        NTR     1.00     1.79         
KH      6401.0    04000         FOP        NTR     5.00     8.95         
KH      7863.0    04000         FOP        NTR     12.00    21.48        

選択する主キーがない、このような奇妙なデザインのテーブルに遭遇したことはありません。

皆さんが提供できる支援について、私は非常に感謝しています!

4

2 に答える 2

1

1 つのアプローチ: 各タイプのコミッションに個別にリンクし、case 句を使用して、最も具体的な利用可能なものを決定します。次のようにします。

SELECT T.staffid, 
       T.invoiceid, 
       T.invoiceitemid, 
       I.subclassid, 
       I.classid, 
       T.quantity, 
       T.invoiceprice,
       case
           when iic.staffid is not null then iic.commission
           when scc.staffid is not null then scc.commission
           when icc.staffid is not null then icc.commission
           else def.commission
       end Applicable_Commission
FROM TRANSACT T
JOIN INVOITEM I ON T.invoiceitemid = I.invoiceitemid
LEFT JOIN stcomm iic /* Invoice Item Commission */
  ON T.staffid = iic.staffid and 
     T.invoiceitemid = iic.invoiceitemid
LEFT JOIN stcomm scc /* Sub Class Commission */
  ON T.staffid = scc.staffid and 
     T.subclassid = scc.subclassid and 
     T.invclassid = scc.invclassid
LEFT JOIN stcomm icc /* Inv Class Commission */
  ON T.staffid = icc.staffid and 
     T.invclassid = icc.invclassid and 
     icc.subclassid is null
LEFT JOIN stcomm def /* Default Commission */
  ON T.staffid = iic.staffid and 
     def.invclassid is null and 
     def.subclassid is null and 
     def.invoiceitemid is null
WHERE T.staffid = 'KH'
于 2013-06-16T17:11:54.790 に答える