如何在同一字段上使用不同的 where 子句获得不同的计数?

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)

在此处输入图片说明

Han*_*non 5

看起来你真的想要一个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 有OrganizationIDDeviceFilter。将来,请知道,如果您为所涉及的对象(表等)提供脚本化的 DDL,以及数据表,而不是屏幕截图,它会帮助我们为您提供更好的答案。

在这里,我将尝试以PIVOT易于理解的方式显示子句语法:

PIVOT (
    COUNT(SINo)
    FOR OrganizationID IN (
        [1000]
        , [1001]
    )
) pvt;
Run Code Online (Sandbox Code Playgroud)

第一个明显的位是PIVOT关键字的存在。这告诉 SQL Server 我们将提供以下项目:

  1. 来自主“src”SELECT查询的一列,包裹在聚合中,例如MAX(), SUM(),或者在我们的例子中,COUNT()
  2. 我们想要的列标题,以“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)