我需要一些幫助來獲得以下解決方案。
我有一個 case when 陳述句,當一個值是一個特定的數字時,我需要它回傳一定數量的聯合所有結果。查詢示例如下。
例如,if T0.Docnum = 1我需要它回傳 3 行 9。
顯然,當我運行下面的查詢時,我得到了子查詢回傳多個結果的錯誤。我現在沒有想法。
任何想法表示贊賞。
我正在使用 SSMS 和 SQL Server 2016。
謝謝
select
case
when cast(count(T0.Docnum) as nvarchar(max)) = 1
then (select '999'
union all
select '999'
union all
select '999'
union all
select '999'
union all
select '999')
when cast(count(T0.docnum) as nvarchar(max)) = 2
then (select '999'
union all
select '999'
union all
select '999'
union all
select '999')
when cast(count(T0.docnum) as nvarchar(max)) = 3
then (select '999'
union all
select '999'
union all
select '999')
end
uj5u.com熱心網友回復:
“生成”附加行的一種簡單方法是使用 CROSS APPLY
(在 GROUP BY 之后,我在子查詢中做的......)
SELECT
*
FROM
(
SELECT
X,
Y,
COUNT(TO.docnum) AS doc_count
FROM
something
GROUP BY
X,
Y
)
AS foo
CROSS APPLY
(
SELECT '999' AS generated
UNION ALL
SELECT '999' WHERE doc_count IN (3,2,1)
UNION ALL
SELECT '999' WHERE doc_count IN (2,1)
UNION ALL
SELECT '999' WHERE doc_count IN (1)
)
AS bar
始終回傳 1 行。
如果 doc_count 為 1、2 或 3,則回傳第二行。如果 doc_count 為 1 或 2,則
回傳第三行 如果 doc_count 為 1,則回傳第四行
編輯:回復評論。
CROSS APPLY
(
SELECT '999' AS generated
UNION ALL
SELECT '999' WHERE doc_count IN (5,3,2,1)
UNION ALL
SELECT '999' WHERE doc_count IN (5,2,1)
UNION ALL
SELECT '999' WHERE doc_count IN (5,1)
UNION ALL
SELECT '999' WHERE doc_count IN (5)
)
所有五行都匹配 doc_count = 5 的場景,因此它生成五行。
但是只有四行與 doc_count = 1 的場景匹配,因此將生成四行。
uj5u.com熱心網友回復:
檢查這個小提琴,看看它是否對你有幫助。我使用了一個變數來模擬你的情況。我不確定您確定行數的邏輯是什么。
我使用 CTE 生成任意數量的行,然后從中選擇 999。
https://dbfiddle.uk/?rdbms=sqlserver_2016&fiddle=cbaf378f43139dc47c2bcc1f1190442d
DECLARE @docnum INT;
SET @docnum = 1;
WITH r AS (
SELECT 1 AS n
UNION ALL
SELECT n 1 FROM r WHERE n 1<=
CASE WHEN @docnum = 3 then 1
when @docnum = 2 then 2
when @docnum = 1 then 3 end
)
SELECT 999 FROM r;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/336024.html
標籤:sql sql-server
