问题描述
这是我的示例表:
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"