2

私は3つのテーブルを持っています。

  • tax_master
  • item_master
  • item_tax

その中の値はこのようなものです。

*tax_master*
tax_id  tax_name tax_value
--------------------------
  1     Vat      5
  2     LBT      8

*item_master*
item_id   Prise
---------------
  1        30
  2        100

*item_tax*
item_tax_id   item_id   tax_id
------------------------------
    1           1         1
    2           2         2
    3           1         2

今、私はこのような出力が欲しいです。

item_id  prise VAT   LBT   Total_prise
---------------------------------------
   1      30   1.5   2.4      33.9
   2     100    -     8       108

VAT 値は次の5/30*100よう5%に計算されます30=1.5

4

3 に答える 3

0
select item_id, price,
       (min(case when tax_name = 'VAT' then tax end)) vat,
       (min(case when tax_name = 'LBT' then tax end)) lbt,
       coalesce(min(case when tax_name = 'VAT' then tax end),0) +
       coalesce(min(case when tax_name = 'LBT' then tax end),0) +
       price total
  from 
      (select a.item_id item_id,
              c.tax_name tax_name,
              (c.tax_value * b.price / 100) tax,
              b.price price
         from item_tax a inner join item_master b on a.item_id = b.item_id
                         inner join tax_master c on a.tax_id = c.tax_id) as calc
 group by item_id, price;

ここでデモ。

于 2013-08-23T11:07:38.237 に答える
0

次のステートメントは、必要な方法でデータを返す必要があります。

SELECT DISTINCT
    item_master.item_id,
   (SELECT
        tax_master.tax_value * item_master.prise / 100
    FROM
        item_tax, tax_master
    WHERE
        item_tax.item_id = item_master.item_id and
        tax_master.tax_id = item_tax.tax_id and
        tax_master.tax_name = 'VAT') as VAT,

   (SELECT
        tax_master.tax_value * item_master.prise / 100
    FROM
        item_tax, tax_master
    WHERE
        item_tax.item_id = item_master.item_id and
        tax_master.tax_id = item_tax.tax_id and
        tax_master.tax_name = 'LBT') as LBT
FROM
    item_tax, item_master, tax_master    
WHERE
    item_master.item_id = item_tax.item_id and
    tax_master.tax_id = item_tax.tax_id

bwt:賞品は価格であるべきだと思います;)

于 2013-08-23T10:42:32.570 に答える
0

編集:フィドルで試してみましたが、左の結合の上に最大(または最小)でグループ化する必要があります:

SELECT item_master.item_id,
       MAX(item_master.price * tax_master_vat.tax_value / 100) as VAT,
       MAX(item_master.price * tax_master_lbt.tax_value / 100) as LBT
FROM item_master
LEFT JOIN item_tax ON item_master.item_id = item_tax.item_id
LEFT JOIN tax_master tax_master_vat ON item_tax.tax_id = tax_master_vat.tax_id
                                   AND tax_master_vat.tax_name = 'VAT'
LEFT JOIN tax_master tax_master_lbt ON item_tax.tax_id = tax_master_lbt.tax_id
                                   AND tax_master_lbt.tax_name = 'LBT'
GROUP BY item_master.item_id

特定のアイテムにリンクされた tax_value がない場合は、NULL を返す必要があります (NULL との乗算は NULL です)。「null」(または何も表示しない) とは異なるものを表示したい場合は、COALESCE を使用できます。合計金額を含めたい場合:

価格または合計を追加したい場合は、item_master テーブルでこれを結合したままにすることができます。

SELECT item_master.item_id,
       tax.VAT,
       tax.LBT,
       item_master.price + COALESCE(tax.VAT, 0) + COALESCE(tax.LBT, 0) AS Total
FROM item_master
LEFT JOIN ( SELECT item_master.item_id,
                   MAX(item_master.price * tax_master_vat.tax_value / 100) as VAT,
                   MAX(item_master.price * tax_master_lbt.tax_value / 100) as LBT
                   FROM item_master
            LEFT JOIN item_tax ON item_master.item_id = item_tax.item_id
            LEFT JOIN tax_master tax_master_vat ON item_tax.tax_id = tax_master_vat.tax_id
                                               AND tax_master_vat.tax_name = 'VAT'
            LEFT JOIN tax_master tax_master_lbt ON item_tax.tax_id = tax_master_lbt.tax_id
                                               AND tax_master_lbt.tax_name = 'LBT'
            GROUP BY item_master.item_id ) tax ON item_master.item_id = tax.item_id

または、OVER PARTITION BY 句を使用できます (item_id のみでグループ化できますが、価格フィールドは引き続き含めることができます)。

SELECT item_id,
       price,
       VAT,
       LBT,
       price + COALESCE(VAT, 0) + COALESCE(LBT, 0) AS Total
FROM ( SELECT DISTINCT
              item_master.item_id,
              item_master.price,
              MAX(item_master.price * tax_master_vat.tax_value / 100) OVER (PARTITION BY item_master.item_id) as VAT,
              MAX(item_master.price * tax_master_lbt.tax_value / 100) OVER (PARTITION BY item_master.item_id) as LBT
       FROM item_master
       LEFT JOIN item_tax ON item_master.item_id = item_tax.item_id
       LEFT JOIN tax_master tax_master_vat ON item_tax.tax_id = tax_master_vat.tax_id
                                          AND tax_master_vat.tax_name = 'VAT'
       LEFT JOIN tax_master tax_master_lbt ON item_tax.tax_id = tax_master_lbt.tax_id
                                          AND tax_master_lbt.tax_name = 'LBT'
    ) price_and_tax

SQL フィドルの例

于 2013-08-23T11:17:29.993 に答える