SQL ВСТАВЛЕННЫЕ ПРОБЛЕМЫ СОЕДИНЕНИЯ - PullRequest
0 голосов
/ 28 мая 2020

У меня чертовски много времени, чтобы мой запрос работал правильно. У меня есть 3 таблицы (ORDERS, ORDERSITEMS, ORDERPAYMENTS), в которых я пытаюсь создать отчет для ежемесячных налогов с продаж, который будет выглядеть следующим образом:

MONTH      YEAR        TOTAL RECEIPTS        EXEMPT RECEIPTS     NON-EXEMPT RECEIPTS        SALES TAX
1           2020        $5,000                $4,500                $500                      $31.25

ОБЩИЕ ПОЛУЧЕНИЯ: To чтобы получить это число, вам нужно сложить вместе все C .OrderPayments_Amount для данного периода времени, в данном случае МЕСЯЦ (C .OrderPayments_Date) = 1 И ГОД (C .OrderPayments_Date) = 2020

ОСВОБОЖДЕННЫЕ ЧЕНЫ: Вы должны определить, облагается ли товар налогом (например, цифровые файлы не облагаются налогом с продаж, а физические распечатки). Чтобы получить это, вы должны определить, облагается ли товар налогом, проверив B.OrdersItems_ItemChargeSalesTax. Если это поле равно 0, налог с продаж не взимается, а если он равен 1, то налог с продаж не взимается. Затем вам нужно отфильтровать, чтобы получить ORDERSITEMS только для временного интервала января 2020 года, используя группировку по столбцу C .OrderPayments_Date, который имеет B.OrdersItems_ItemChargeSalesTax = 0, и, наконец, сложите B.OrdersItems_Total вместе.

НЕЗАВИСИМЫЕ ПОЛУЧЕНИЯ: Чтобы получить этот номер, вы делаете то же самое для СЛЕДУЮЩИХ ПОЛУЧЕНИЙ выше, за исключением того, что вы ищите B.OrdersItems_ItemChargeSalesTax = 1 и складываете B.OrdersItems_Total вместе.

НАЛОГ НА ПРОДАЖУ: Чтобы получить это число, вы используете тот же фильтр даты, что и до МЕСЯЦА (C .OrderPayments_Date) = 1 И ГОД (C .OrderPayments_Date) = 2020, а затем добавьте столбец A.Order_SalesTax вместе.

Первый запрос, который я перечислил, работает нормально и дает мне общие уплаченные налоги и общий доход за месяц (прямо сейчас я жестко запрограммировал оператор WHERE, но он будет применяться через фильтры в моем списке страница). Что мне нужно получить из таблицы ORDERSITEMS, так это поле с именем ORDERSITEMS_ItemTotal и суммировать это поле, чтобы это была однострочная запись в запросе. Я видел, как другой человек выполнял вложенное соединение. Мы будем очень благодарны за любые предложения.

**ORDERS TABLE "A"**
  Order_ID, 
  Order_SalesTax,
  stateTaxAbbreviation

**ORDERSITEMS TABLE "B"**
  Order_FK,
  OrdersItems_ItemChargeSalesTax,
  OrdersItems_Total

ПРИМЕЧАНИЕ. В таблице ORDERSITEMS один Order_FK может появляться несколько раз, так как в заказе может быть много элементов

**ORDERPAYMENTS TABLE "C"**
  Order_FK,
  OrderPayments_PaymentDate,
  OrderPayments_Amount

ПРИМЕЧАНИЕ. В таблице ORDERPAYMENTS один Order_FK может появляться несколько раз, поскольку по заказу может быть несколько платежей.

Записывая это, это кажется простой задачей, но когда Я пытаюсь собрать все вместе, числа неправильные, потому что он добавляет записи несколько раз, потому что в заказе несколько элементов, и, таким образом, он каждый раз добавляет общую сумму платежа.

Вот код, который я ' я возился, и я был бы очень признателен за любое руководство. Заранее благодарю вас и, надеюсь, я достаточно ясно объяснил свою ситуацию.

Select
    a.stateTaxAbbreviation AS StateAbbr,
    MONTH(c.OrderPayments_Date) AS PaymentMonth,
    YEAR(c.OrderPayments_Date) AS PaymentYear,
    SUM(c.OrderPayments_Amount) AS TotalPayments,
    SUM(a.Order_SalesTax) AS sales_tax
FROM dbo.ORDERS a
   INNER JOIN ORDERPAYMENTS as c ON c.Order_FK = a.Order_ID
      LEFT OUTER JOIN ORDERITEMS b on b.Order_FK = a.Order_ID 
  WHERE a.stateTaxAbbreviation = 'MA' AND Month(b.OrderPayments_Date) = 1 AND YEAR(b.OrderPayments_Date) = 2020
  GROUP BY stateTaxAbbreviation , MONTH(c.OrderPayments_Date), Year(c.OrderPayments_Date)

Ответы [ 2 ]

0 голосов
/ 30 мая 2020

Спасибо Воутеру за то, что указал мне в правильном направлении. Посмотрев на его предложение, я вернулся и оценил то, что мне нужно, и создал решение, которое работало, основанное на его идее. Спасибо за терпение, Воутер, ваша проницательность очень помогла!

    Select StateAbbr, OrderYear, OrderMonth, SUM(TotalSales) As TotalSales, SUM(TotalSales)-SUM(TaxableRevenue) As ExemptRevenue, SUM(TaxableRevenue) As TaxableRevenue, SUM(SalesTax) As SalesTax
 FROM (
 Select
        /*Get Total Sales and Total Sales Tax Collected*/
        a.stateTaxAbbreviation AS StateAbbr,
        MONTH(a.Order_Date) As OrderMonth,
        YEAR(a.Order_Date) As OrderYear,
        SUM((a.Order_TotalBaseSale + a.Order_Shipping) - (((a.Order_PercentDiscount*a.Order_TotalBaseSale)/100) + a.Order_DollarDiscount)) As TotalSales,
        SUM(0) As ExemptRevenue,
        Sum(0) As TaxableRevenue,
        SUM(a.Order_SalesTax) AS SalesTax

 FROM dbo.ORDERS a
    WHERE a.Order_Status != 'Cancelled'
    Group By a.stateTaxAbbreviation, MONTH(a.Order_Date), YEAR(a.Order_Date)

    UNION ALL

Select
    /*GET EXEMPT ORDERS*/
    a.stateTaxAbbreviation AS StateAbbr,
    MONTH(a.Order_Date) As OrderMonth,
    YEAR(a.Order_Date) As OrderYear,
    Sum(0) As TotalSales,
    Sum(OrdersItems_ItemTotal) AS ExemptRevenue,
    Sum(0) AS TaxableRevenue,
    Sum(0) As SalesTax

FROM ORDERSITEMS b
LEFT JOIN ORDERS a ON Order_ID = b.Order_FK
    WHERE b.OrdersItems_ItemChargeSalesTax = 0 and a.Order_Status != 'Cancelled'
    Group By a.stateTaxAbbreviation, MONTH(a.Order_Date), YEAR(a.Order_Date)

    UNION ALL
Select
    /*GET NON-EXEMPT ORDERS*/
    a.stateTaxAbbreviation AS StateAbbr,
    MONTH(a.Order_Date) As OrderMonth,
    YEAR(a.Order_Date) As OrderYear,
    SUM(0) As TotalSales,
    SUM(0) AS ExemptRevenue,
    Sum(OrdersItems_ItemTotal) AS TaxableRevenue,
    Sum(0) As SalesTax

FROM ORDERSITEMS b
LEFT JOIN ORDERS a ON Order_ID = b.Order_FK
WHERE b.OrdersItems_ItemChargeSalesTax <> 0 and a.Order_Status != 'Cancelled'
Group By a.stateTaxAbbreviation, MONTH(a.Order_Date), YEAR(a.Order_Date)
)t

GROUP BY StateAbbr, OrderMonth, OrderYear
ORDER BY StateAbbr ASC, OrderYear DESC, OrderMonth ASC
0 голосов
/ 28 мая 2020

Вероятно, вам следует написать 2 запроса: один для присоединения к таблице ORDERPAYMENTS, а другой - для присоединения к таблице ORDERITEMS. Затем их можно комбинировать с UNION ALL.

Примерно так:

SELECT StateAbbr,PaymentMonth,PaymentYear,SUM(TotalPayments),SUM(sales_tax),SUM(OrdersItems_Total)
FROM (
    Select
        a.stateTaxAbbreviation AS StateAbbr,
        MONTH(c.OrderPayments_Date) AS PaymentMonth,
        YEAR(c.OrderPayments_Date) AS PaymentYear,
        SUM(c.OrderPayments_Amount) AS TotalPayments,
        SUM(a.Order_SalesTax) AS sales_tax,
        0 as OrdersItems_Total
    FROM dbo.ORDERS a
       INNER JOIN ORDERPAYMENTS as c ON c.Order_FK = a.Order_ID
     WHERE a.stateTaxAbbreviation = 'MA' AND Month(c.OrderPayments_Date) = 1 AND YEAR(c.OrderPayments_Date) = 2020
     GROUP BY stateTaxAbbreviation , MONTH(c.OrderPayments_Date), Year(c.OrderPayments_Date)

     UNION ALL


     Select
        a.stateTaxAbbreviation AS StateAbbr,
        MONTH(c.OrderPayments_Date) AS PaymentMonth,
        YEAR(c.OrderPayments_Date) AS PaymentYear,
        0 AS TotalPayments,
        0 AS sales_tax,
        SUM(B.OrdersItems_Total) as OrdersItems_Total

    FROM dbo.ORDERS a
     INNER JOIN ORDERITEMS b on b.Order_FK = a.Order_ID 
     WHERE a.stateTaxAbbreviation = 'MA' AND Month(b.OrderPayments_Date) = 1 AND YEAR(b.OrderPayments_Date) = 2020
     GROUP BY stateTaxAbbreviation , MONTH(c.OrderPayments_Date), Year(c.OrderPayments_Date)
 )t
GROUP BY StateAbbr,PaymentMonth,PaymentYear
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...