#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