SQL Query (SQL Server 2008) 从两个表中检索数据并对结果进行分组

Posted

技术标签:

【中文标题】SQL Query (SQL Server 2008) 从两个表中检索数据并对结果进行分组【英文标题】:SQL Query (SQL Server 2008) to retrieve data from two tables and group results 【发布时间】:2011-05-29 22:22:22 【问题描述】:

我有两个表(假设 2 列:IDcategory)。我想从第一个表,第二个表中检索记录,按类别对结果进行分组(两个表中有相同的类别)并分别计算它们。例如:

第一个表:

ID | category
-------------
1 | category1
2 | category2
3 | category3
4 | category1
5 | category2

第二张表:

ID | category
--------------
a | category1
b | category2
c | category3
d | category3

我想得到如下结果:

category | count(id from 1 table) | count(id from 2 table)
------------------------------------------------------------
category1 |        2 |        1
category2 |        2 |        2
category3 |        1 |        3

我试试这个:

SELECT r.AFFECTED_ITEM as usluga,
       COUNT(r.ID) AS problemy,
       (SELECT COUNT(k.ID)
          FROM KNOWNERRORM1 k
         WHERE k.AFFECTED_ITEM = r.AFFECTED_ITEM
      GROUP BY k.AFFECTED_ITEM) AS znane_bledy<br>
FROM ROOTCAUSEM1 r
group by r.AFFECTED_ITEM

...但是在结果中应该有更少的记录(因为内部连接)。

当我使用完全联接时,应该有更多记录..

【问题讨论】:

【参考方案1】:

按照 Siva 的建议进行修改。

SELECT COALESCE(table1Grouped.Category, table2Grouped.Category) AS Category, COALESCE(table1Grouped.IDCount, 0) AS Table1IDCount, COALESCE(table2Grouped.IDCount, 0) AS Table2IDCount
FROM
(
    SELECT table1.category, COUNT(table1.ID) AS IDCount
    FROM table1
    GROUP BY table1.category
) AS table1Grouped
    FULL OUTER JOIN
(
    SELECT table2.category, COUNT(table2.ID) AS IDCount
    FROM table2
    GROUP BY table2.category
) AS table2Grouped
    ON
table1Grouped.category = table2Grouped.Category

【讨论】:

如果对您有帮助,请标记为已回答。 @Siva - 感谢您的建议,我已经进行了修改。 @Siva - 已更正。这里已经是深夜了。我没有直接思考。谢谢。【参考方案2】:

你可以试试这个……

SELECT Category, COUNT(Id) AS TableOneCount, 0 AS TableTwoCount
FROM Table1
UNION
SELECT Category, 0 AS TableOneCount, COUNT(Id) AS TableTwoCount
FROM Table2
GROUP BY Category

对不起,如果这不起作用,我在家里,没有安装 SQL Server 或其他任何东西来测试它(我是那些不在家编码的程序员之一:-p)

【讨论】:

嗨,很可爱,它几乎可以工作(我有转换错误,但可以修复)。非常感谢你。 :)【参考方案3】:
SELECT
  category,
  table1count = COUNT(CASE tableid WHEN 1 THEN 1 END),
  table2count = COUNT(CASE tableid WHEN 2 THEN 1 END)
FROM (
  SELECT 1, category
  FROM Table1
  UNION ALL
  SELECT 2, category
  FROM Table2
) x (tableid, category)
GROUP BY category

【讨论】:

【参考方案4】:

Select Category,(Select count(id) from t1 where t1.Category=t3.Category),(Select count(id) from t2 where t2.Category=t3.Category) 从 t3 开始

t3 包含

类别1 类别2 第三类

【讨论】:

以上是关于SQL Query (SQL Server 2008) 从两个表中检索数据并对结果进行分组的主要内容,如果未能解决你的问题,请参考以下文章

Query (SQL Server 2008 Express) 在 SQL Server Management Studio 中有效,但在 Delphi 中使用 ADODB 无效

SQL Server-2012 database query foundation

Understanding how SQL Server executes a query

Sql Query 列出 SQL Server 2005 数据库中的所有视图

如何使用 SQL Query 在 SQL Server 中的表级别进行镜像或复制

SQL server Query Count() 优化