[英]Union all within subquery
我需要一些幫助來獲得以下解決方案。
我有一個 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
“生成”附加行的一種簡單方法是使用 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 的場景匹配,因此將生成四行。
你可以這樣做,然后用 CASE WHEN 封裝每一行
select case when cast(count(T0.Docnum) as nvarchar(max)) = 1
then
'9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999' end,
case when cast(count(T0.Docnum) as nvarchar(max)) = 1
then
'9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999' end ,
case when cast(count(T0.Docnum) as nvarchar(max)) = 1
then
'9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999' end,
case when cast(count(T0.Docnum) as nvarchar(max)) = 1
then
'9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999' end ,
case when cast(count(T0.Docnum) as nvarchar(max)) = 1
then
'9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999' end,
CASE when cast(count(T0.docnum) as nvarchar(max)) = 2 then
'9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999' END ,
CASE when cast(count(T0.docnum) as nvarchar(max)) = 2 then
'9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999' END ,
CASE when cast(count(T0.docnum) as nvarchar(max)) = 2 then
'9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999' END,
CASE when cast(count(T0.docnum) as nvarchar(max)) = 2 then
'9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999' end,
CASE when cast(count(T0.docnum) as nvarchar(max)) = 3 then
'9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999' end,
CASEwhen cast(count(T0.docnum) as nvarchar(max)) = 3 then
'9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999' end,
CASE when cast(count(T0.docnum) as nvarchar(max)) = 3 then
'9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999' end
FROM IO
檢查這個小提琴,看看它是否對你有幫助。 我使用了一個變量來模擬你的情況。 我不確定您確定行數的邏輯是什么。
我使用 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;
你在用oracle嗎? 如果是這樣,您可以使用按級別連接來生成行。
select '999' from dual
connect by level <= 6 -(select count(documen) from mytable)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.