如果连接表对MySQL为空,则不执行求和

时间:2018-03-27 16:45:40

标签: mysql

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

___ BillableDatas

|--------|------------|---------|--------------|------------|
| BIL_Id | BIL_Date   |BIL_Rate | BIL_Quantity | BIL_Status |
|--------|------------|---------|--------------|------------|
|      1 | 2018-03-01 |     105 |            1 |    charged |
|      2 | 2018-03-01 |      15 |            2 | notcharged |
|      3 | 2018-03-01 |       5 |            1 | 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 |
|-----------|-----------|
  • ATX_BILId是___ BillableDatas的商品ID链接。
  • ATX_STXId是与___ SalesTaxes的税号ID链接。

我需要每天得到项目的总和    - 不含税    - 含税

这样的方法就是这样:

|------------------|---------------|------------|
| BIL_RateNonTaxed | BIL_RateTaxed | BIL_Status |
|------------------|---------------|------------|
|           105.00 |        126.00 |    charged | <- Taxes #8, #9 applicable
|            35.00 |         35.00 | notcharged | <- No taxes here
|------------------|---------------|------------|

对总数的说明:

  • 105 = 105*1 - (收费项目的总和乘以数量)
  • 35 = (15*2)+5 - (不收费项目的总和乘以数量)
  • 126.00 = 105+(105*(5+15)/100)
  • 35.00 =没有税,请将未纳税的价值。

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

SELECT BIL_Status
    , SUM(BIL_Rate*BIL_Quantity) BIL_RateNonTaxed
    , IFNULL(SUM((BIL_Rate*BIL_Quantity)+(BIL_Rate*BIL_Quantity*total_sales_tax/100)), SUM(BIL_Rate*BIL_Quantity)) BIL_RateTaxed 
    FROM 
    ( SELECT b.*
            , SUM(t.STX_Amount) total_sales_tax 
        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
GROUP 
    BY BIL_Status

此查询适用于每个项目都有链接的taxe(我的项目#1的情况)。当项目没有链接税(项目#2和#3)时,不会产生总和。

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

链接中唯一的错误是我应该35而不是30

感谢。

1 个答案:

答案 0 :(得分:0)

子查询是错误的分组。您正在按ATX_BILId进行分组,但我认为您确实希望获得所有独特的可计费数据bill_ids。至少以下查询返回您的预期。唯一的区别是改变&#34; GROUP BY ATX_BILId&#34; to&#34; GROUP BY BIL_Id&#34;

SELECT BIL_Status
    , SUM(BIL_Rate*BIL_Quantity) BIL_RateNonTaxed
    , IFNULL(SUM((BIL_Rate*BIL_Quantity)+(BIL_Rate*BIL_Quantity*total_sales_tax/100)), SUM(BIL_Rate*BIL_Quantity)) BIL_RateTaxed 
    FROM 
    ( SELECT b.*
            , SUM(t.STX_Amount) total_sales_tax 
        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 BIL_Id
     ) x
GROUP 
    BY BIL_Status

Link to SQL Fiddle

通常,在对此类查询进行故障排除时,首先要检查返回的行而不使用group bys。运行以下查询时,更容易看到问题。

SELECT BIL_Status, 
     BIL_Rate,
     BIL_Quantity,
     total_sales_tax
    FROM 
    ( SELECT b.*
            , SUM(t.STX_Amount) total_sales_tax 
        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