2012-03-22 50 views
3

我有一個視圖vw_XC_DocInfo_1,列VId,VName,DocId,Amount,INum。以下是表格數據。SELECT語句中具有聚合函數的記錄的SQL Server連接

Vid VName DocId Amount INum 
1  ABC  10  100 INV1 
1  ABC  11  10  INV2 
1  ABC  12  20  INV3 
1  ABC  13  30  INV4 
2  XYZ  14 200  INV5 
2  XYZ  15  10  INV6 
2  XYZ  16  20  INV7 
2  XYZ  17  30  INV8 

我需要顯示如下的輸出。

Vid VName DocIdsList Amount INumList 
1  ABC 10,11  110  INV1,INV2 
1  ABC 12,13  50  INV3,INV4 
2  XYZ 14,15  210  INV5,INV6 
3  XYZ 16,17  50  INV7,INV8 

我已經嘗試了不同的方法,但無法包含聚合函數與STUFF函數,請查找我累了的查詢。

with CTE 
as (
    select top 20 V.VendorId, 
     V.VendorName, 
     STUFF((
       select top 3 ',' + CONVERT(varchar(MAX), V1.DocumentId) 
       from vw_XC_DocInfo_1 V1 
       where V1.VendorID = V.VendorId 
       order by V1.DocumentId 
       for xml PATH('') 
       ), 1, 1, '') as DocIdsList, 
     STUFF((
       select top 3 ',' + CONVERT(varchar(MAX), V1.InvoiceNumber) 
       from vw_XC_DocInfo_1 V1 
       where V1.VendorID = V.VendorId 
       order by V1.InvoiceNumber 
       for xml PATH('') 
       ), 1, 1, '') as InvNumList 
    from vw_XC_DocInfo_1 V 
    order by V.VendorID 
    ) 
select VendorId, 
    VendorName, 
    DocIdsList, 
    InvNumList 
from CTE 
group by VendorId, 
    VendorName, 
    DocIdsList, 
    InvNumList 
+0

隨意評論,如果我困惑,我是一個newbee不能發佈一個問題,良好的格式.Apolozies的。 – 2012-03-22 20:09:00

+0

@RedFilter感謝您的編輯。 – 2012-03-22 20:09:40

+2

決定哪些行進入同一組的規則是什麼? – 2012-03-22 20:10:15

回答

0

你可以看看聚結 - http://www.mssqltips.com/sqlservertip/1521/the-many-uses-of-coalesce-in-sql-server/

但短暫的狩獵之後 - 我認爲這裏的問題將幫助更多:Concatenate many rows into a single text string?

查看由僅限Ritesh使用XML_Path

答案
+0

感謝您的時間,我可以使用STUFF函數進行分析。但是我無法在主要查詢中包含SUM(AMT)聚合函數。 – 2012-03-22 20:25:28

+0

-1 - 這真的無助於解決 – Lamak 2012-03-22 20:26:15

+0

這個問題,我花了一段時間才意識到這只是一種模糊的遞歸形式 - 但如果需要的話可能會非常有用;) – Aprillion 2012-03-22 20:28:51

1

這對你有用嗎?

SELECT V.VendorId, 
     V.VendorName, 
     STUFF((
      select ',' + CONVERT(varchar(MAX), V1.DocumentId) 
      from vw_XC_DocInfo_1 V1 
      where V1.VendorID = V.VendorId 
      order by V1.DocumentId 
      for xml PATH('') 
      ), 1, 1, '') as DocIdsList, 
     SUM(V.Amount) as AmountSums, 
     STUFF((
      select ',' + CONVERT(varchar(MAX), V1.InvoiceNumber) 
      from vw_XC_DocInfo_1 V1 
      where V1.VendorID = V.VendorId 
      order by V1.InvoiceNumber 
      for xml PATH('') 
      ), 1, 1, '') as InvNumList 
FROM vw_XC_DocInfo_1 V 
GROUP BY V.VendorId, V.VendorName 
ORDER BY V.VendorId, V.VendorName 

抱歉,我曾在我的打字許多錯誤......我想我得到它歸功於勒夫伊薩克森

+0

我需要將結果集與上面生成的動態列表進行分組,使用函數function.It不會工作,我也試過了。 – 2012-03-22 20:29:56

+0

你是對的......我忘記了小組的條款。我編輯的答案是否有效? (如果沒有,你能提供結果生成/或錯誤信息) – 2012-03-22 20:33:37

+2

@FrancisP http://sqlfiddle.com/#!3/5cecf/2 – 2012-03-22 20:40:53

3

怎麼樣的東西稍微多條條框框?

SELECT VendorId, VendorName, 
    CASE WHEN COUNT(DocumentId)>1 
     THEN CAST(MIN(DocumentId) AS VARCHAR(MAX)) + ',' + 
      CAST(MAX(DocumentId) AS VARCHAR(MAX)) 
     ELSE CAST(MIN(DocumentId) AS VARCHAR(MAX)) 
    END AS DocIdList, 
    SUM(Amount) Amount, 
    CASE WHEN COUNT(InvoiceNumber)>1 
     THEN MIN(InvoiceNumber) + ',' + MAX(InvoiceNumber) 
     ELSE MIN(InvoiceNumber) 
    END AS INumList 
FROM 
    (SELECT *,(ROW_NUMBER() OVER (PARTITION BY VendorId 
           ORDER BY VendorId) - 1)/2 AS seq 
     FROM vw_XC_DocInfo_1) AS result 
GROUP BY VendorId, VendorName, seq 

演示here

+0

感謝百萬人的回答,有沒有辦法我們可以在groupby中控制no記錄。例如,如果我們有一個vendorid的10條記錄。我們需要將它分組爲4,4,2(其餘)上面的查詢限制爲2,2,2,2,2。我需要將這4個參數作爲參數。這是可能的。再次感謝。 – 2012-03-22 22:32:33

+0

@GaneshBasava你剛剛解釋了他們將如何總是被分組2.現在你問一個完全不同的問題。 – 2012-03-23 08:49:54

0
;with a 
as 
(
    select Vid,VName,DocId,Amount,INum, 
    row_number() over(partition by vid order by Inum) n 
    from vw_XC_DocInfo_1 
) 
select a.Vid, a.vname, 
cast(a.docid as varchar(3)) + coalesce(','+cast(b.docid as varchar(9)), '') docid, 
a.amount + coalesce(b.amount, 0) amount, 
a.INum + coalesce(',' + b.INum, '') INumList 
from a left join a b on a.n + 1 = b.n and a.vid = b.vid 
where a.n%2 = 1