Sql 在不使用join的情况下合并3个表,但需要分组

Sql 在不使用join的情况下合并3个表,但需要分组,sql,Sql,我有3个不同的表格,如下所示: | DataEntry: | | OOW: | | ContractExpired: | | +----+-----------------------| | +----+-------------| | +----+-------------| | Country | valid | invalid | | Country | Warranty | | Country | Ex

我有3个不同的表格,如下所示:

| DataEntry:                   |  | OOW:               |  | ContractExpired:   |
| +----+-----------------------|  | +----+-------------|  | +----+-------------|
| Country | valid  | invalid   |  | Country | Warranty |  | Country | Expired  |
| AU      | 1      | 2         |  | AU      | 1        |  | AU      | 1        |
| CN      | 22     | 3         |  | CN      | 1        |  | CN      | 1        |
| JP      | 1      | 1         |  | +----+-------------|  | +----+-------------|
| KR      | 1      | 1         |
| SG      | 1      | 1         |
| +----+-----------------------|
我写的查询如下:

SELECT Country,
(SELECT SUM(CASE WHEN CallType = 'valid' THEN 1 ELSE Null END) AS [valid] FROM DataEntry AS DataEntry_1) AS [valid],
(SELECT SUM(CASE WHEN CallType = 'Invalid' THEN 1 ELSE Null END) AS [Invalid] FROM DataEntry AS DataEntry_2) AS [Invalid],
(SELECT COUNT(CallType) AS [Warranty] FROM OOW) AS [Warranty],
(SELECT COUNT(CallType) AS [Expired] FROM ContractExpired) AS [Expired]
返回的结果如下所示:

| valid | invalid | warranty | Expired |
| 26    | 8       | 2        | 2       |
我想通过分组到国家对其进行一些更改: 样品

我尝试按分组,但查询返回错误结果:

SELECT Country,
(SELECT SUM(CASE WHEN CallType = 'valid' THEN 1 ELSE Null END) AS [valid] FROM DataEntry AS DataEntry_1) AS [valid],
(SELECT SUM(CASE WHEN CallType = 'Invalid' THEN 1 ELSE Null END) AS [Invalid] FROM DataEntry AS DataEntry_2) AS [Invalid],
(SELECT COUNT(CallType) AS [Warranty] FROM OOW) AS [Warranty],
(SELECT COUNT(CallType) AS [Expired] FROM ContractExpired) AS [Expired]
FROM DataEntry AS DataEntry_3
Group by Country
结果:

| Country | valid | invalid | warranty | Expired |
| AU      | 26    | 8       | 2        | 2       |
| CN      | 26    | 8       | 2        | 2       |
| JP      | 26    | 8       | 2        | 2       |
| KR      | 26    | 8       | 2        | 2       |
| SG      | 26    | 8       | 2        | 2       |

请提供一些指导来解决这个问题。

您的查询不应该是下面这样的吗。这可能不是确切的查询,但会让您知道如何使其工作

SELECT de.Country,
SUM(CASE WHEN de.CallType = 'valid' THEN 1 ELSE Null END) AS [valid],
SUM(CASE WHEN de.CallType = 'Invalid' THEN 1 ELSE Null END) AS [Invalid],
FROM DataEntry de
join
(
select COUNT(CallType) AS [Warranty] 
FROM OOW
group by country
) tab on de.country = tab.country
join
(
SELECT COUNT(CallType) AS [Expired] 
FROM ContractExpired
group by country
) tab1 on de.country = tab1.country
Group by de.Country

您需要在子查询中执行group by,然后使用外部联接按国家/地区代码将聚合数据联接在一起,因为并非所有国家/地区的OOW和ContractExpired表中都有条目。请注意,这将仅显示数据条目表中至少有一条有效或无效记录的国家/地区

SELECT [countryDataEntry].Country, [countryDataEntry].[valid], [countryDataEntry].[Invalid], Warranty, Expired
from ((SELECT Country
            ,SUM(CASE WHEN CallType = 'valid' THEN 1 ELSE Null END) AS [valid]
            ,SUM(CASE WHEN CallType = 'Invalid' THEN 1 ELSE Null END) as [Invalid] 
       FROM DataEntry AS DataEntry_1 GROUP BY Country
      ) AS [countryDataEntry]
    LEFT OUTER JOIN (SELECT Country, COUNT(CallType) AS [Warranty] FROM OOW GROUP BY Country) AS [Warranty] ON [countryDataEntry].Country = [Warranty].Country)
    LEFT OUTER JOIN (SELECT Country, COUNT(CallType) AS [Expired] FROM ContractExpired GROUP BY Country) AS [Expired] ON [countryDataEntry].Country = [Expired].Country
试试这个:

SELECT * FROM DataEntry DE
LEFT OUTER join OOW ON
OOW.Country = DE.Country
LEFT OUTER JOIN ContractExpired CE ON
CE.Country = DE.Country
如果您想查看以下SQLFIDLE的数据示例,则其仅在3天内处于活动状态:

如果您真的想在没有联接的情况下执行此操作,您可以,而且非常简单。您必须使用子选择,并使用WHERE子句对其进行筛选:

SELECT de.Country
  SUM(CASE WHEN de.CallType = 'valid'   THEN 1 ELSE Null END) AS [valid],
  SUM(CASE WHEN de.CallType = 'Invalid' THEN 1 ELSE Null END) AS [Invalid],
  (SELECT COUNT(CallType)
    FROM OOW o
    WHERE o.Country=de.Country) AS [Warranty],
  (SELECT COUNT(CallType)
    FROM ContractExpired ce
    WHERE ce.Country=de.Country) AS [Expired]
FROM DataEntry de
GROUP BY de.Country
有一个问题

此SQL假定您具有与SQL匹配的以下表结构,但不是您提供给我们的结构:

DataEntry(
  Country  CHAR,
  Calltype CHAR);

OOW(
  Country  CHAR,
  Calltype CHAR);

CREATE TABLE ContractExpired(
  Country  CHAR,
  Calltype CHAR);

确保在所有三个表中都有关于国家的索引。但对于这里发布的任何答案,无论是连接还是子选择,这都是一个很好的建议。

这可能是因为您使用的是求和和和计数吗?合并查询表怎么样?您应该先用group by创建四个子查询,然后将它们连接在一起,而不是在select子句中使用子查询。@Jaugar Chang:我试过了,但这样做,数据会重复。您应该在join语句和结果中,然后我们可以找出问题所在。实际上,您的SQL与您的数据库结构不匹配。我想知道数据输入表。每个国家/地区是否有一行,其中包含所示结构中的有效和无效调用类型之和,或者是否有多行,其中的calltype列告诉您调用是否有效,如您使用的SQL中所示?要添加到Rahul的答案中,请确保您使用的是外部联接,否则您将不会获得JP、KR或SG的任何记录。谢谢!这就是答案。我使用的是交叉连接。未调用特定字段。难怪它不起作用,重复数据。它也起作用。我没有调用函数->table1.country=table2.country。这就是为什么数据在假设为空时不显示null。谢谢
DataEntry(
  Country  CHAR,
  Calltype CHAR);

OOW(
  Country  CHAR,
  Calltype CHAR);

CREATE TABLE ContractExpired(
  Country  CHAR,
  Calltype CHAR);