【问题标题】:SQL: Is it possible to merge these two SQL statements into a single query?SQL:是否可以将这两个 SQL 语句合并到一个查询中?
【发布时间】:2016-03-05 18:50:47
【问题描述】:

我在 Windows 7 上使用 MS SQL Server 2014。

在数据库中,我有一个名为Orders 的表,如下所示:

OrderID | CustomerID | OrderDate | ...   
----------------------------------------
1028      90           2015-10-10   
...
2416      68           2016-02-12

我需要两件事:

  1. 客户总数
  2. 今年的客户数量。

我是 SQL 的初学者,但我设法在我的应用程序中编写了 2 个似乎可以完成这项工作的 SQL 语句:

对于要求 #1

SELECT COUNT(DISTINCT CustomerID) FROM Orders; // result = 74   

对于要求 2:

SELECT COUNT(DISTINCT CustomerID) FROM Orders WHERE OrderDate >= '2016-01-01'; // result = 34   

我想知道是否可以将上述 2 个 SQL 语句以某种方式合并/组合成一个查询...?当然,我需要两个结果:客户总数(上述情况下为 74 个)和今年的客户(即 34 个)。

该数据库是一个远程数据库,因此非常欢迎任何提高查询性能的想法:)

【问题讨论】:

  • 如果您的问题是关于 SQL Server 2014,为什么要标记 mysql 和 sql-server-ce?我已经删除了它们。
  • 呵呵,mysql是suggested tag,sql-server-ce是其他用户添加的。感谢编辑。
  • 我们有 2 个答案(目前),见下文。我测试了两者,两者都工作正常。哪个更快还是差不多?

标签: sql sql-server performance database-performance processing-efficiency


【解决方案1】:

使用条件聚合:

SELECT COUNT(DISTINCT CustomerID) as Total,
       COUNT(DISTINCT CASE WHEN OrderDate >= '2016-01-01' THEN CustomerID END) as Total_2016
FROM Orders;

【讨论】:

    【解决方案2】:

    您可以像上一个答案一样水平组合数据,也可以使用 UNION 垂直组合它们,如果您认为需要表格形式,则如下所示:

    SELECT 'Total Customers' As Description, COUNT(DISTINCT CustomerID) As Number FROM Orders // total = 74   
    Union ALL   
    SELECT '2016 Customers' AS Description, COUNT(DISTINCT CustomerID) As Number FROM Orders WHERE OrderDate >= '2016-01-01'; // this_year = 34
    

    【讨论】:

      猜你喜欢
      • 2022-01-08
      • 2011-01-23
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 2012-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多