【问题标题】:how to change SQL query by not using union all如何通过不使用 union all 来更改 SQL 查询
【发布时间】:2017-11-02 22:09:42
【问题描述】:

这是桌子

table table_nm(
ID
,AA
,BB
)

而且,这是我想要更改的查询

select
COUNT(DISTINCT(ID)) AS ID_AA
, AA as AA_1
, 0 as ID_BB
, 0 as BB_1 
from table_nm
group by
AA

UNION ALL

select
  0 as ID_AA
, 0 as AA_1
, COUNT(DISTINCT(ID)) AS ID_BB
, BB as BB_1
from table_nm
group by
BB

如何在没有 UNION ALL 的情况下更改该查询?

【问题讨论】:

标签: sql sql-server database union-all


【解决方案1】:

我猜你正在寻找这样的东西。

SELECT L.ID_AA, L.AA_1, R.ID_BB, R.BB_1 
FROM ( 
    select
    COUNT(DISTINCT(ID)) AS ID_AA
    , AA as AA_1
    , 0 as ID_BB
    , 0 as BB_1 
    from table_nm
    group by AA
) AS L
FULL JOIN
(
    select
      0 as ID_AA
    , 0 as AA_1
    , COUNT(DISTINCT(ID)) AS ID_BB
    , BB as BB_1
    from table_nm
    group by BB
) AS R ON L.AA_1 = R.BB_1

【讨论】:

    【解决方案2】:

    您可以像这样使用GROUPING SETSGROUPING_ID

    SELECT 
           CASE WHEN grouping_ID(tn.AA) = 0 THEN tn.AA ELSE 0 END AS AA_1,
           CASE WHEN grouping_ID(tn.AA) = 0 THEN count(DISTINCT(tn.ID)) ELSE 0 END AS ID_AA,
           CASE WHEN grouping_ID(tn.BB) = 0 THEN tn.BB ELSE 0 END AS BB_1,
           CASE WHEN grouping_ID(tn.BB) = 0 THEN count(DISTINCT(tn.ID)) ELSE 0 END  AS ID_BB
    FROM @table_nm tn
    GROUP BY GROUPING SETS ((tn.AA),(tn.BB))
    

    在这里查看演示http://rextester.com/SWN42877

    【讨论】:

      【解决方案3】:

      您将能够使用以下查询。

      SELECT t1.AA_1,
             t1.ID_AA,
             t2.BB_1,
             t2.ID_BB
      FROM
      (
          SELECT AA AS AA_1,
                 COUNT(DISTINCT ID) AS ID_AA
          FROM table_nm
          GROUP BY AA
      ) t1
      FULL OUTER JOIN
      (
          SELECT BB AS BB_1,
                 COUNT(DISTINCT ID) AS ID_BB
          FROM table_nm
          GROUP BY BB
      ) t2 ON t1.AA_1 = t2.BB_1;
      

      为了获得空值 0,您可以分别对 MySQL、SQL Server 和 Oracle 使用 COALESCE()(即标准 ANSI SQL)、IFNULLISNULLNVL 函数。

      【讨论】:

      • DISTINCT 不是函数。您可以删除那些多余的括号以使事情更清楚。 (即COUNT(DISTINCT ID)
      • COALESCE() 是返回第一个非空参数的通用函数。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-26
      • 1970-01-01
      相关资源
      最近更新 更多