【问题标题】:mariadb UNION select how to return two columns insted of one row?mariadb UNION select如何返回两列而不是一行?
【发布时间】:2021-06-18 15:49:46
【问题描述】:

我在 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 子句 一组相关的数据,例如:

问:

Month
Jan 
Feb
March
Apr 

和Qb:

Operations
3
4
2
4

我尝试了各种方法让查询返回 使用 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)
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

有没有办法获得两列的结果?我在这里做错了什么?

谢谢

【问题讨论】:

    标签: mysql sql mariadb


    【解决方案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)
    

    【讨论】:

    • 哇,我已经尝试过同样的方法,但没有添加逗号,这是我的一个愚蠢的错误!男人有时候是那么的难看。我没有查看代码,而是尝试了各种愚蠢的 UNION CASE 等。谢谢!!
    【解决方案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);
    

    为什么你会想这样做让我很困惑。

    【讨论】:

    • 这是第二次接近解决方案,唯一的麻烦是它在每个响应列中添加了 NULLS。无论如何,谢谢。
    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2022-12-09
      • 2018-12-05
      • 2012-11-15
      • 1970-01-01
      • 2020-01-19
      • 2019-07-05
      • 1970-01-01
      • 1970-01-01
      • 2021-10-23
      相关资源
      最近更新 更多