簡體   English   中英

在子查詢中聯合所有

[英]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)

http://sqlfiddle.com/#!4/82360e/10

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM