2017-08-05 41 views
-2

我們有3代表在SQL Server平均/總和從下到層次結構的頂部 - SQL服務器

Here is the Schema of the tables

組將有一個層次結構和那些將被映射到用戶表的用戶。每個用戶在交易表中都有交易。

我們希望得到的輸出爲:

- Company (810)  
    - New York (810)    
     - Administration (310) 
      - USER 1 100 
      - USER 2 200 
      - USER 3  10 
     - Support (500) 
      - USER 4 500 

    - Michigan   
     - Accounts  
    - San Diego   

任何人都可以建議SQL查詢來實現這一目標?

+7

您沒有表現出什麼努力,但我建議您在表示層中處理這種類型的輸出格式。 –

+0

請求的格式不能從您的描述中清楚。請以表格格式顯示所需的輸出。 – dybzon

+0

好奇你的_schema_有數據,但沒有數據類型。並且有'Group_Id'和'User_Id',但沒有'Transaction_Id'。請閱讀[this](http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/)瞭解一些關於改善問題的提示。 – HABO

回答

0

您可以使用遞歸CTE來構建組的層次結構。之後,您可以將您的用戶和交易加入到此層次結構中。

下面是一個使用你的表定義的例子:

WITH GroupHierarchy AS (
    SELECT 
     GROUP_ID, 
     GROUP_NAME, 
     PARENT_ID, 
     CONVERT(NVARCHAR(200),NULL) AS PARENT_NAME, 
     0 AS HierarchyLevel 
    FROM GROUPS g 
    WHERE g.PARENT_ID IS NULL 
    UNION ALL 
    SELECT 
     g.GROUP_ID, 
     g.GROUP_NAME, 
     g.PARENT_ID, 
     gh.GROUP_NAME AS PARENT_NAME, 
     HierarchyLevel + 1 AS HierarchyLevel 
    FROM GROUPS g 
     INNER JOIN GroupHierarchy gh ON gh.GROUP_ID = g.PARENT_ID 
) 
SELECT 
    gh.PARENT_NAME, 
    gh.GROUP_NAME, 
    HierarchyLevel, 
    [USER_NAME], 
    SUM([VALUE]) AS TransactionSum, 
    AVG([VALUE]) AS TransactionAvg 
FROM GroupHierarchy gh 
    LEFT OUTER JOIN USERS u ON u.GROUP_ID = gh.GROUP_ID 
    LEFT OUTER JOIN TRANSACTIONS t on t.[USER_ID] = u.[USER_ID] 
GROUP BY PARENT_NAME, GROUP_NAME, HierarchyLevel, [USER_NAME] 
ORDER BY PARENT_NAME, GROUP_NAME, HierarchyLevel, [USER_NAME] 

上面的查詢會給你這樣的輸出格式:

PARENT_NAME GROUP_NAME  HierarchyLevel USER_NAME TransactionSum TransactionAvg 
-------------- -------------- -------------- ------------ -------------- -------------- 
NULL   Company   0    NULL   NULL   NULL 
Company  Michigan  1    User 3  44    22 
Company  Michigan  1    User 4  100   100 
Company  New York  1    User 1  310   103 
Company  New York  1    User 2  570   190 
Company  San Diego  1    User 5  54    54 
Company  San Diego  1    User 6  NULL   NULL 
Michigan  Accounts  2    User 9  NULL   NULL 
Michigan  Finance   2    User 10  NULL   NULL 
New York  Administration 2    User 7  NULL   NULL 
New York  Support   2    User 8  NULL   NULL 
San Diego  Sales   2    NULL   NULL   NULL 
San Diego  Service   2    NULL   NULL   NULL 
0

這一切都是建立在對SQL現在。與:

GROUP BY ROLLUP(PARENT_NAME, GROUP_NAME, [USER_NAME]) 

當正在彙總值時,較低級別的字段將是NULL

請參閱https://technet.microsoft.com/en-us/library/ms189305(v=sql.90).aspx瞭解更多信息,以及如何處理源字段(如果適用)中的NULL,並在輸出中指定NULL。 (大量的ISNULL秒)