Jub*_*ert 0 sql-server count distinct
如何在单个语句中获得具有不同条件的DISTINCT行,如果计数为零,则结果为零?COUNTSELECT
我尝试了以下查询:
SELECT DISTINCT
A.DeviceFilter,
(SELECT count(*) FROM DeviceLicense AS B WHERE A.DeviceFilter = B.DeviceFilter AND b.OrganizationId = 1001)
FROM
DeviceLicense AS A
GROUP BY
A.DeviceFilter
Run Code Online (Sandbox Code Playgroud)
看起来你真的想要一个PIVOT.
首先,我们将创建您的DeviceLicense表,并填充一些示例数据:
CREATE TABLE dbo.DeviceLicense
(
SINo int NOT NULL
, DeviceFilter nvarchar(50) NULL
, OrganizationID int NOT NULL
);
INSERT INTO dbo.DeviceLicense (SINo, DeviceFilter, OrganizationID)
VALUES (1, NULL, 1001)
, (2, NULL, 1001)
, (3, 'iPad', 1000)
, (4, 'iPad', 1001)
, (5, 'MACommon', 1000)
, (6, 'MACommon', 1001);
Run Code Online (Sandbox Code Playgroud)
这是PIVOT声明。如下所示,该语句PIVOT向典型语句添加了一个子句,SELECT以允许通过聚合将行转换为列。
SELECT *
FROM (
SELECT *
FROM dbo.DeviceLicense
) src
PIVOT (
COUNT(SINo)
FOR OrganizationID IN (
[1000]
, [1001]
)
) pvt;
Run Code Online (Sandbox Code Playgroud)
select上面语句的结果:
+--------------+------+------+ | 设备过滤器 | 1000 | 1001 | +--------------+------+------+ | 空 | 0 | 2 | | iPad | 1 | 1 | | MACommon | 1 | 1 | +--------------+------+------+
我还没有添加您的所有示例数据,因此输出是有限的,但是您可以看到 each 有列,而 each 有OrganizationID行DeviceFilter。将来,请知道,如果您为所涉及的对象(表等)提供脚本化的 DDL,以及数据表,而不是屏幕截图,它会帮助我们为您提供更好的答案。
在这里,我将尝试以PIVOT易于理解的方式显示子句语法:
PIVOT (
COUNT(SINo)
FOR OrganizationID IN (
[1000]
, [1001]
)
) pvt;
Run Code Online (Sandbox Code Playgroud)
第一个明显的位是PIVOT关键字的存在。这告诉 SQL Server 我们将提供以下项目:
SELECT查询的一列,包裹在聚合中,例如MAX(), SUM(),或者在我们的例子中,COUNT()。我们想要的列标题,以“src”SELECT查询中列中存在的值列表的形式。在本例中,该OrganizationID列包含值 1000 和 1001,我们希望将它们显示为标题。该OrganizationID列可能包含其他值,例如 1002,但按照PIVOT现在编写子句的方式,这些行中的值将不会显示。为了将 1002 个值显示为另一列,我们需要像这样定义枢轴:
PIVOT (
COUNT(SINo)
FOR OrganizationID IN (
[1000]
, [1001]
, [1002] --note this creates an additional column in the output!
)
) pvt;
Run Code Online (Sandbox Code Playgroud)