SQL Server:我正在尝试根据另一列添加条件选择的列值

问题描述

这是我的示例表:

CREATE TABLE demo1 
(
    ProviderID int NOT NULL,ProviderClientID int NOT NULL,ClientIdentifier nvarchar(9) NOT NULL,ClientIdentifierTypeID int NOT NULL
);

INSERT INTO demo1 (ProviderID,ProviderClientID,ClientIdentifier,ClientIdentifierTypeID)
VALUES 
(5,7,123444567,1),(5,000111234,2),11,145342332,12,234212345,13,324564332,3),14,123222467,19,234444879,000111643,999234252,20,456333245,1)

ClientIdentifierTypeID 列的值表示:

1 - Drivers License #,2 - SchoolID,3 - StateID

因此客户端可以使用不同的标识符类型多次出现在表中。

我想选择每个客户和他们的驾驶执照号码。如果他们没有驾驶执照,则获取他们的州身份证。我根本不想要他们的学号。

这将成为我接下来要做的客户计数的一部分。

这是我迄今为止在查询中尝试过的(我已经过滤掉了学校 ID):

WITH A AS
(
    SELECT
        *
    FROM
        demo1
    WHERE
        ClientIdentifierTypeID IN ('1','3')
),B AS
(
    SELECT
        *,ROW_NUMBER() OVER(PARTITION BY [ProviderClientID] ORDER BY [ClientIdentifierTypeID]) AS rn
    FROM 
        A
)
SELECT
    *
FROM 
    B
WHERE 
    rn = 1

编辑:我正在重新阅读我的查询,它似乎做我想做的。 有license时#rn为1。若无license,state id为rn=1。

解决方法

如果计算包括学校 ID 在内的客户端,则禁用 where 子句,否则启用它。

-- sql server
SELECT ProviderClientID,COUNT(1) count_client,MIN(CASE WHEN ClientIdentifierTypeID = 1
                   THEN ClientIdentifier
                WHEN ClientIdentifierTypeID = 3
                   THEN ClientIdentifier
           END)
FROM demo1
-- WHERE ClientIdentifierTypeID IN ('1','3')
GROUP BY ProviderClientID;
,

我使用两个 Select 来过滤。一是获取有驾照的用户。第二个块是获取拥有 Sate 但没有驾驶执照的用户。 然后将两个列表与 UNION ALL 结合起来。
这是一种可能性。

S3cret\ with\ spaces
\#not-a-comment
backslash:\\
"anything"
"double\"quote"

Result