MySQL - Попытка вернуть одну строку для каждой отдельной ДАТЫ;показывая ДЕНЕЖНЫЕ, КРЕДИТ и грандиозный ИТОГО - PullRequest
0 голосов
/ 24 октября 2019

Я пытаюсь объединить каждую уникальную ДАТУ в одну строку. Вместо этого я получаю итоговую сумму за CASH, возвращаемую в виде одной строки, а затем итоговую сумму за CREDIT, возвращаемую как другую строку. Как мне объединить эти строки в одну строку, сгруппированную по DATE?

См. Мой запрос ниже:

SELECT 
DISTINCT orders.service_date,

/* CASH TOTAL */
CASE WHEN
customer.payment_type = "Cash"
THEN

CONCAT('$',
(SELECT   

SUM(
    ((CASE
    WHEN
      orders.service= 'MT'
        THEN
          cast(customer.mtrate as DECIMAL(10,2))
    WHEN
      orders.service= 'MTF'
        THEN
          cast(customer.mtfrate as DECIMAL(10,2))
    WHEN
      orders.service= 'MTB'
        THEN
          cast(customer.mtbrate as DECIMAL(10,2))
  END) + cast(((orders.cu + orders.pw + orders.r + orders.lr + orders.misc) * 0.80) as DECIMAL(10,2)))))) 

  ELSE 
  " - "   
  END as Cash,


  /* CREDIT TOTAL */
  CASE WHEN
customer.payment_type = "Credit"
THEN

CONCAT('$',
(SELECT   

SUM(
    ((CASE
    WHEN
      orders.service= 'MT'
        THEN
          cast(customer.mtrate as DECIMAL(10,2))
    WHEN
      orders.service= 'MTF'
        THEN
          cast(customer.mtfrate as DECIMAL(10,2))
    WHEN
      orders.service= 'MTB'
        THEN
          cast(customer.mtbrate as DECIMAL(10,2))
  END) + cast(((orders.cu + orders.pw + orders.r + orders.lr + orders.misc) * 0.80) as DECIMAL(10,2)))))) 

  ELSE 
  " - "   
  END as Credit,

  /* GRAND TOTAL */

  CONCAT('$',
(SELECT   

SUM(
    ((CASE
    WHEN
      orders.service= 'MT'
        THEN
          cast(customer.mtrate as DECIMAL(10,2))
    WHEN
      orders.service= 'MTF'
        THEN
          cast(customer.mtfrate as DECIMAL(10,2))
    WHEN
      orders.service= 'MTB'
        THEN
          cast(customer.mtbrate as DECIMAL(10,2))
  END) + cast(((orders.cu + orders.pw + orders.r + orders.lr + orders.misc) * 0.80) as DECIMAL(10,2)))))) as Total

FROM finalproject.orders

INNER JOIN finalproject.customer
USING(customerid)

GROUP BY customer.payment_type, orders.service_date
ORDER BY orders.service_date ASC

Что возвращается:

enter image description here

Большинство запросов, которые вы можете игнорировать - арифметика и тому подобное ... Я новичок в MySQL ... любые предложения приветствуются. Спасибо!

Ответы [ 3 ]

1 голос
/ 24 октября 2019

Вы рядом. Сгруппируйте только по service_date, так как вы хотите одну строку результатов на service_date. Затем включите payment_type в условную агрегацию, т.е. внутри SUM.

SELECT
  o.service_date,
  SUM(CASE WHEN c.payment_type = 'Cash' THEN
        CASE o.service
          WHEN 'MT'  THEN CAST(c.mtrate AS DECIMAL(10,2))
          WHEN 'MTF' THEN CAST(c.mtfrate AS DECIMAL(10,2))
          WHEN 'MTB' THEN CAST(c.mtbrate AS DECIMAL(10,2))
        END + 
        CAST(((o.cu + o.pw + o.r + o.lr + o.misc) * 0.80) AS DECIMAL(10,2))
      END
  ) AS cash,
  SUM(CASE WHEN c.payment_type = 'Credit' THEN
        CASE o.service
          WHEN 'MT'  THEN CAST(c.mtrate AS DECIMAL(10,2))
          WHEN 'MTF' THEN CAST(c.mtfrate AS DECIMAL(10,2))
          WHEN 'MTB' THEN CAST(c.mtbrate AS DECIMAL(10,2))
        END + 
        CAST(((o.cu + o.pw + o.r + o.lr + o.misc) * 0.80) AS DECIMAL(10,2))
      END
  ) AS credit,
  SUM(CASE o.service
        WHEN 'MT'  THEN CAST(c.mtrate AS DECIMAL(10,2))
        WHEN 'MTF' THEN CAST(c.mtfrate AS DECIMAL(10,2))
        WHEN 'MTB' THEN CAST(c.mtbrate AS DECIMAL(10,2))
      END + 
      CAST(((o.cu + o.pw + o.r + o.lr + o.misc) * 0.80) AS DECIMAL(10,2))
  ) AS total
FROM finalproject.orders o
JOIN finalproject.customer c USING (customerid)
GROUP BY o.service_date
ORDER BY o.service_date;
0 голосов
/ 24 октября 2019

Самый простой (возможно, немного грязный раствор) - оберните его в другой SELECT:

SELECT service_date, cash, credit, sum(total) as total from (-your original query-) as o group by o.service_date

0 голосов
/ 24 октября 2019

используя group by customer.payment_type, orders.service_date, вы собираетесь создать 2 строки для одного дня

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...