使用MySQL列出3个不同表中的项目

时间:2018-03-28 14:21:16

标签: mysql

我有以下表格结构,并试图从这些表格中做出报告:

___ BillableDatas

|--------|------------|---------|--------------|------------|
| BIL_Id | BIL_Date   |BIL_Rate | BIL_Quantity | BIL_Status |
|--------|------------|---------|--------------|------------|
|      1 | 2018-03-01 |     105 |            2 | notcharged |
|      2 | 2018-03-02 |     115 |            2 |    charged |
|      3 | 2018-03-03 |     105 |            1 | notcharged |
|      4 | 2018-03-04 |     105 |            1 | notcharged |
|      5 | 2018-03-05 |     105 |            3 | notcharged |
|--------|------------|---------|--------------|------------|

___ SalesTaxes

|--------|--------------|------------|
| STX_Id | STX_TaxeName | STX_Amount |
|--------|--------------|------------|
|      8 |        Tax 1 |      5.000 |
|      9 |        Tax 2 |     15.000 |
|--------|--------------|------------|

STX_Amount是一个百分比。

___ ApplicableTaxes

|-----------|-----------|
| ATX_BILId | ATX_STXId |
|-----------|-----------|
|         1 |         8 |
|         1 |         9 |
|         2 |         9 |
|         3 |         9 |
|         4 |         9 |
|         5 |         9 |
|-----------|-----------|
  • ATX_BILId是___ BillableDatas的商品ID链接。
  • ATX_STXId是与___ SalesTaxes的税号ID链接。

这样的方法就是这样:

|------------|--------------|------------|------------|-----------|
| BIL_Date   | STX_TaxeName | BIL_Rate   | STX_Amount | STX_Total |
|------------|--------------|------------|------------|-----------|
| 2018-03-01 |        Tax 1 |    210.00  |      5.000 |     10.50 |
| 2018-03-01 |        Tax 2 |    210.00  |     15.000 |     31.50 |
| 2018-03-03 |        Tax 2 |    105.00  |     15.000 |     15.75 |
| 2018-03-04 |        Tax 2 |    105.00  |     15.000 |     15.75 |
| 2018-03-05 |        Tax 2 |    315.00  |     15.000 |     47.25 |
|------------|--------------|------------|------------|-----------|

我不希望具有状态的项目:收费

对总数的说明:

  • STX_TaxeName是来自___ SalesTaxes的相关税的名称。
  • BIL_Rate是来自___ BillableDatas的BIL_Rate * BIL_Quantity
  • STX_Amount是___ SalesTaxes的税率。
  • STX_TotalBIL_Rate的计算百分比。 (BIL_Rate*STX_Amount/100)。

我的最后一次尝试就是这个:

SELECT BIL_Status
    , SUM(BIL_Rate*BIL_Quantity) BIL_Rate
    , IFNULL(SUM((BIL_Rate*BIL_Quantity)+(BIL_Rate*BIL_Quantity*total_sales_tax/100)), SUM(BIL_Rate*BIL_Quantity)) STX_Total 
    FROM 
    ( SELECT b.*
            , SUM(t.STX_Amount) total_sales_tax
            , STX_TaxeName
            , STX_Amount
        FROM ___BillableDatas b 
        LEFT JOIN ___ApplicableTaxes bt 
            ON bt.ATX_BILId = b.BIL_Id 
        LEFT JOIN ___SalesTaxes t 
            ON t.STX_Id = bt.ATX_STXId 
        GROUP  
            BY ATX_BILId
     ) x
WHERE BIL_Status = 'notcharged'
ORDER 
    BY BIL_Date DESC    
GROUP 
    BY BIL_Status

如果需要,请参阅此SQLFiddle以帮助您:
http://sqlfiddle.com/#!9/2bb244/11

感谢。

1 个答案:

答案 0 :(得分:0)

你不能只用一个简单的JOIN吗?

SELECT BIL_Date, STX_TaxeName, BIL_Rate * BIL_Quantity AS NewRate, STX_Amount
  , BIL_Rate * BIL_Quantity * STX_Amount / 100 AS Total
FROM ___BillableDatas b 
JOIN ___ApplicableTaxes bt ON bt.ATX_BILId = b.BIL_Id 
JOIN ___SalesTaxes t ON t.STX_Id = bt.ATX_STXId 
WHERE BIL_Status = 'notcharged' 
ORDER BY BIL_Date, STX_TaxeName

使用您的sqlfiddle中的GROUP BY更新了查询:

SELECT 
    BIL_Date
    , STX_Id
    , STX_TaxeName
    , SUM(BIL_Rate * BIL_Quantity) AS NewRate
    , STX_Amount
    , SUM(BIL_Rate * BIL_Quantity * STX_Amount / 100) AS Total
FROM ___BillableDatas b 
    JOIN ___ApplicableTaxes bt ON bt.ATX_BILId = b.BIL_Id 
    JOIN ___SalesTaxes t ON t.STX_Id = bt.ATX_STXId 
WHERE BIL_Status != 'cancelled' 
AND BIL_Date between "2018-03-01" AND "2018-03-31"
GROUP BY BIL_Date, STX_Id, STX_TaxeName, STX_Amount
ORDER BY BIL_Date, STX_TaxeName