SQL: Est-il possible de merge ces deux instructions SQL en une seule requête?

J'utilise MS SQL Server 2014 sur Windows 7.

Dans la database, j'ai une table nommée Orders , qui ressemble à ceci:

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

J'avais besoin de deux choses:

  1. le nombre total de clients
  2. le nombre de clients cette année.

Je suis un débutant en SQL, mais j'ai réussi à écrire 2 instructions SQL dans mon application qui semblent faire le travail:

Pour l'exigence # 1

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

Pour l'exigence 2:

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

Je voudrais savoir s'il est possible de merge / combiner d'une manière ou d'une autre les deux instructions SQL ci-dessus en une seule requête …? Bien sûr, j'ai besoin des deux résultats: le total des clients (74 dans le cas ci-dessus) et aussi les clients de cette année (soit 34).

La database est une database distante, donc toute idée d'accélérer les performances de la requête est la bienvenue.

Utiliser l'agrégation conditionnelle:

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

Vous pouvez combiner datatables horizontalement comme dans la réponse précédente ou vous pouvez les combiner verticalement en utilisant UNION, comme ceci, si vous pensez avoir besoin d'une forme tabulaire:

 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