上下文: Server中的有一个很大的XLSX文件,我正在映射到一个文件。每次都会有一个名为'referentie‘的列获得不同的值。我需要计数唯一的值,并显示相应的代码。(请注意,这是一个较大SELECT语句中的子查询。我无法添加额外的聚合函数。)
问题:在查询中,您将看到有多个计数不同的情况。SQL抛出正常的错误:
Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.
My查询:
(SELECT COUNT(DISTINCT CASE WHEN Referentie > 10 THEN N'CON1' END) AS [HEADER/CHECK],
COUNT(DISTINCT CASE WHEN Referentie <= 10 AND Referentie > 29 THEN N'CON2' END) AS [HEADER/CHECK],
COUNT(DISTINCT CASE WHEN Referentie <= 30 AND Referentie >= 50 THEN N'CON3' END) AS [HEADER/CHECK],
COUNT(DISTINCT CASE WHEN Referentie <= 50 AND Referentie >= 500 THEN N'CON4' END) AS [HEADER/CHECK]
FROM OPENJSON(@Json, N'$.Blad1')
WITH (Referentie nvarchar(100) N'$.Referentie')) AS [HEADER/CHECK],
问题:
文件中的JSON :
@Json = N'{
"Blad1":[
{
removed
}
]
}'
发布于 2022-05-02 02:58:18
首先,你对你想要达到的目标有些不清楚。您说您正在设法计算唯一值,但不显示依赖于此的值。
你的代码甚至不能处理这个。它实际上所做的是检查Referentie
是否在定义的数字内(因为它是一个字符串而没有任何意义),然后与单个字符串区分开来。然后,它多次返回这个参数,每个参数都返回一次。
相反,您需要一个单独的COUNT (DISTINCT Referentie)
,它的周围有一个CASE
来检查它的大小。
当前代码还有另一个问题。>
和<
的条件是相反的。< 29
应该是< 30
。
SELECT
'SomeValue' AS xyz,
(
SELECT
CASE
WHEN COUNT(DISTINCT Referentie) < 10
THEN N'CON1'
WHEN COUNT(DISTINCT Referentie) >= 10 AND COUNT(DISTINCT Referentie) < 29
THEN N'CON2'
WHEN COUNT(DISTINCT Referentie) >= 30 AND COUNT(DISTINCT Referentie) <= 50
THEN N'CON3'
WHEN COUNT(DISTINCT Referentie) >= 50 AND COUNT(DISTINCT Referentie) <= 500
THEN N'CON4'
END
FROM OPENJSON(@Json, N'$.Blad1')
WITH (
Referentie nvarchar(100)
) AS j
) AS [HEADER/CHECK]
FROM (VALUES(0)) DummyTable(DummyValue) -- don't know what the rest of your query is
FOR XML PATH(N''), ROOT(N'rootElement'),TYPE
另外,如果您确实希望从子查询中获得多个列,则需要将其放置在APPLY
中。
https://stackoverflow.com/questions/72084085
复制