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