ОБЪЕДИНЕНИЕ mariadb выберите, как вернуть два столбца вместо одной строки?

#mysql #sql #mariadb

Вопрос:

У меня есть следующий запрос в mariadb :

 SELECT
MONTHNAME (itd.DateOfshippment) AS Month
-- COUNT(itm.Name) AS Operations
FROM ImportsMaster itm
INNER JOIN ImportsDetails itd on itm.ID  = itd.IDMSTR 
WHERE itd.Market IS NOT NULL 
AND itm.Trader LIKE "%TEXT%"
AND itd.DateOfshippment between '2020-08-29' and '2020-12-31'
GROUP BY MONTH(itd.DateOfshippment)
 

если я отменяю предложение COUNT и комментирую предложение MONTHNAME, каждый запрос возвращает
соответствующий набор данных, например:

Qa :

 Month
Jan 
Feb
March
Apr 
 

и Qb :

 Operations
3
4
2
4
 

Я пробовал различные способы заставить запрос возвращать два столбца в
одном запросе с помощью ОБЪЕДИНЕНИЯ, например :

 SELECT
    MONTHNAME (itd.DateOfshippment) AS Month
    -- COUNT(itm.Name) AS Operations
    FROM ImportsMaster itm
    INNER JOIN ImportsDetails itd on itm.ID  = itd.IDMSTR 
    WHERE itd.Market IS NOT NULL 
    AND itm.Trader LIKE "%TEXT%"
    AND itd.DateOfshippment between '2020-08-29' and '2020-12-31'
    GROUP BY MONTH(itd.DateOfshippment)
UNION SELECT
    -- MONTHNAME (itd.DateOfshippment) AS Month
    COUNT(itm.Name) AS Operations
    FROM ImportsMaster itm
    INNER JOIN ImportsDetails itd on itm.ID  = itd.IDMSTR 
    WHERE itd.Market IS NOT NULL 
    AND itm.Trader LIKE "%TEXT%"
    AND itd.DateOfshippment between '2020-08-29' and '2020-12-31'
    GROUP BY MONTH(itd.DateOfshippment)
 

Тем не менее, то, что я получаю обратно, — это результат в одном столбце, такой как :

 Month
Jan 
Feb
March
Apr 
3
4
2
4
 

Есть ли способ получить результат в виде двух столбцов ? что я здесь делаю не так ?

Спасибо

Ответ №1:

Не знаю, почему вы пытаетесь использовать UNION это для этого. Другие ответы полезны, если это необходимо. Просто выбрав оба в одном запросе, вы получите два столбца.

 SELECT
MONTHNAME (itd.DateOfshippment) AS Month
,COUNT(itm.Name) AS Operations
FROM ImportsMaster itm
INNER JOIN ImportsDetails itd on itm.ID  = itd.IDMSTR 
WHERE itd.Market IS NOT NULL 
AND itm.Trader LIKE "%TEXT%"
AND itd.DateOfshippment between '2020-08-29' and '2020-12-31'
GROUP BY MONTH(itd.DateOfshippment)
 

Комментарии:

1. Вау , я уже пробовал то же самое, но без добавления запятой, такая глупая ошибка с моей стороны! Мужчинам иногда так трудно увидеть очевидное . Вместо того, чтобы просматривать код, я перепробовал всевозможные глупые СЛУЧАИ ОБЪЕДИНЕНИЯ и т. Д. Спасибо!!

Ответ №2:

Вы бы выбрали два столбца:

 SELECT MONTHNAME (itd.DateOfshippment) AS Month, NULL as Operations
FROM ImportsMaster itm JOIN
     ImportsDetails itd 
     ON itm.ID  = itd.IDMSTR 
WHERE itd.Market IS NOT NULL AND
      itm.Trader LIKE '%TEXT%' AND
      itd.DateOfshippment between '2020-08-29' and '2020-12-31'
GROUP BY MONTH(itd.DateOfshippment)
UNION ALL
SELECT NULL AS Month,
       COUNT(itm.Name) AS Operations
FROM ImportsMaster itm JOIN
     ImportsDetails itd 
     ON itm.ID = itd.IDMSTR 
WHERE itd.Market IS NOT NULL AND
      itm.Trader LIKE '%TEXT%' AND
      itd.DateOfshippment between '2020-08-29' and '2020-12-31'
GROUP BY MONTH(itd.DateOfshippment);
 

Почему ты хочешь это сделать, меня озадачивает.

Комментарии:

1. Это было второе близкое решение , единственная проблема в том, что оно добавляет НУЛИ в каждый отвечающий столбец. В любом случае, спасибо.

Ответ №3:

UNION ALL выберет все строки из первого запроса и добавит строки из второго запроса к этому результату.

Вы могли бы сделать это так (или просто выбрать оба поля и выполнить это в 1 запросе):

 SELECT 
  query1.Month, 
  query2.Operations,
FROM (
  SELECT
    MONTHNAME (itd.DateOfshippment) AS Month,
    -- COUNT(itm.Name) AS Operations
    row_number() over (order by MONTH(itd.DateOfshippment)) as r
    FROM ImportsMaster itm
    INNER JOIN ImportsDetails itd on itm.ID  = itd.IDMSTR 
    WHERE itd.Market IS NOT NULL 
    AND itm.Trader LIKE "%TEXT%"
    AND itd.DateOfshippment between '2020-08-29' and '2020-12-31'
    GROUP BY MONTH(itd.DateOfshippment)
) query1
cross join (
    -- MONTHNAME (itd.DateOfshippment) AS Month
    COUNT(itm.Name) AS Operations,
    row_number() over (order by MONTH(itd.DateOfshippment)) as r
    FROM ImportsMaster itm
    INNER JOIN ImportsDetails itd on itm.ID  = itd.IDMSTR 
    WHERE itd.Market IS NOT NULL 
    AND itm.Trader LIKE "%TEXT%"
    AND itd.DateOfshippment between '2020-08-29' and '2020-12-31'
    GROUP BY MONTH(itd.DateOfshippment)
) query2
where query1.r = query2.r