【问题标题】:How to create a SQL query result from multiple select statements(WITHOUT UNION)如何从多个 select 语句创建 SQL 查询结果(没有 UNION)
【发布时间】:2019-03-01 13:08:55
【问题描述】:

我有一些选择语句,当单独执行时会返回我需要的内容。 我想将所有这些选择语句组合成一个看起来像普通表格的表格。 我尝试了 UNION 但得到一个错误,说我需要相同数量的参数(显然是列字段),但这不是我想要的。 所以我尝试了这个(我的代码到目前为止)

SELECT Company_Code FROM Company
UNION
SELECT Founder FROM Company
UNION
SELECT CAST(COUNT(Company.id) as varchar(5)) as Number_of_LeadManagers
FROM Lead_Manager
LEFT JOIN Company
ON (Lead_Manager.Companyid = Company.id)
GROUP BY Company.id
UNION
SELECT COUNT(Company.id) as Number_of_SeniorManagers
FROM Senior_Manager
LEFT JOIN Company
ON (Senior_Manager.Companyid = Company.id)
GROUP BY Company.id
UNION
SELECT COUNT(Company.id) as Number_of_Managers
FROM Manager
LEFT JOIN Company
ON (Manager.Companyid = Company.id)
GROUP BY Company.id
UNION
SELECT COUNT(Company.id) as Number_of_Employees
FROM Employee
LEFT JOIN Company
ON (Employee.Companyid = Company.id)
GROUP BY Company.id

整个语句返回我想要的所有内容。 如果每个 select 语句单独运行,则获取我的代码,它会返回我想要的内容(总是返回两行) 我想要的是最终结果只需将所有这些选择语句结果放在一起,这样这将显示 2 行,无论选择语句返回多少列。

我想要澄清的想法 如果我执行

SELECT Company_Code,Founder FROM Company

我明白了

**Result1**
row 1 :  C1 Monika
row 2 :  C2 Samantha

(总是只有 2 行) 如果我执行

   SELECT CAST(COUNT(Company.id) as varchar(5)) as Number_of_LeadManagers
    FROM Lead_Manager
    LEFT JOIN Company
    ON (Lead_Manager.Companyid = Company.id)
    GROUP BY Company.id

我明白了

**Result2**
row 1 : 1
row 2 : 1

其他选择语句基本相同,只是使用不同的表进行计数。 我想要的只是一个允许我将 Result1 和 Result2 放在一起的查询(以及其余的选择结果) 期望的最终结果

**Result3**
row 1 : C1 Monika 1
row 2 : C2 Samantha 1

PS.上周开始的 SQL 还在苦苦挣扎,顺便说一下这是一个家庭作业项目。 如果我的思维方式是错误的,请告诉我,但这就是我在大脑中的看法,无法完全弄清楚如何使用 SQL ;P

【问题讨论】:

  • 我不确定您为什么无法解决该错误。所有查询都有一个结果,因此唯一的区别是返回一个 VARCHAR。如果您将其作为整数返回,则应该没有错误。如果您希望结果在所有结果上都具有整数,除了一些将是 VARCHAR 的记录之外,您将无法编写执行此操作的 any 查询。
  • 您有示例数据吗?您希望您的结果是什么样的?如果您只想要 2 列,请将它们别名为相同的名称,尽管您可能会丢失一些数据上下文。如果使用不期望跨表重复,请使用 UNION ALL 而不是 UNION
  • 您想要每个Company_Code 的一行数据吗?使用Founder,然后计算各个位置?
  • 它是什么类型的 SQL Server?版本?
  • 编辑了我的问题,希望能清楚明白啊哈.....Shawn 这正是我想要的最终结果......SQL Server 2017 社区

标签: sql sql-server


【解决方案1】:

如果你有一个字符串列,那么你需要为 union c 中的每个选择提供一个字符串列

所以你只需要像第一次选择一样将每个计数转换为 char

SELECT Company_Code FROM Company
UNION
SELECT Founder FROM Company
UNION
SELECT CAST(COUNT(Company.id) as varchar(5)) as Number_of_LeadManagers
FROM Lead_Manager
LEFT JOIN Company
ON (Lead_Manager.Companyid = Company.id)
GROUP BY Company.id
UNION
SELECT CAST(COUNT(Company.id) as varchar(5)) as Number_of_SeniorManagers
FROM Senior_Manager
LEFT JOIN Company
ON (Senior_Manager.Companyid = Company.id)
GROUP BY Company.id
UNION
SELECT CAST(COUNT(Company.id)  as varchar(5)) as Number_of_Managers
FROM Manager
LEFT JOIN Company
ON (Manager.Companyid = Company.id)
GROUP BY Company.id
UNION
SELECT CAST(COUNT(Company.id) as varchar(5)) as Number_of_Employees
FROM Employee
LEFT JOIN Company
ON (Employee.Companyid = Company.id)
GROUP BY Company.id

但如果您需要同一行上的所有结果,您可以在子查询上使用左连接

SELECT Company_Code , Founder
  , t1.Number_of_LeadManagers
  , t2.Number_of_SeniorManagers
  , t3.Number_of_Managers 
  , t4.Number_of_Employees
FROM Company
LEFT JOIN (
SELECT Company.id, COUNT(Company.id) as Number_of_LeadManagers
FROM Lead_Manager
LEFT JOIN Company ON Lead_Manager.Companyid = Company.id
GROUP BY Company.id
) t1 on t1.id = company.id
LEFT JOIN (
SELECT  company.id, COUNT(Company.id)  as Number_of_SeniorManagers
FROM Senior_Manager
LEFT JOIN Company
ON (Senior_Manager.Companyid = Company.id)
GROUP BY Company.id
) t2 ON t2.id = company.id
LEFT JOIN (
SELECT company.id, COUNT(Company.id) as Number_of_Managers
FROM Manager
LEFT JOIN Company
ON (Manager.Companyid = Company.id)
GROUP BY Company.id
) t3 ON t3.id = company.id
LEFT JOIN (
SELECT company.id, COUNT(Company.id) as Number_of_Employees
FROM Employee
LEFT JOIN Company
ON (Employee.Companyid = Company.id)
GROUP BY Company.id
) t4 ON t4.id = company.id

【讨论】:

  • 因为您只关心分配给公司的经理,您可以在内部查询中使用INNER JOIN。这可能会使连接的结果更小。
  • 另外,如果您的公司在组中没有任何经理,您需要检查 NULL 并将其切换为 0
【解决方案2】:

将它们全部放在同一行上的最简单方法就是使用相关子查询。

SELECT Company.Company_Code, Company.Founder 
  , (
        SELECT COUNT(Company.id) 
        FROM Lead_Manager
        WHERE Lead_Manager.Companyid = Company.id
    ) AS Number_of_LeadManagers
  , (
        SELECT COUNT(Company.id) 
        FROM Senior_Manager
        WHERE Senior_Manager.Companyid = Company.id
    ) AS Number_of_SeniorManagers
  , (
        SELECT COUNT(Company.id) 
        FROM Manager
        WHERE Manager.Companyid = Company.id
    ) AS Number_of_Managers
  , (
        SELECT COUNT(Company.id) 
        FROM Employee
        WHERE Employee.Companyid = Company.id
    ) AS Number_of_Employees
FROM Company

根据您的数据,您可能需要进一步消除重复数据。

【讨论】:

  • 感谢您的回答肖恩.....我不知道您可以使用“子查询”之类的东西来学习一下哈哈哈它帮助我理解了上面的答案,这也有帮助
猜你喜欢
  • 2019-01-08
  • 1970-01-01
  • 2018-06-08
  • 1970-01-01
  • 2013-03-06
  • 2013-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多