2012-07-04 2 views
4

Может кто-нибудь помочь мне в написании запроса SQL, который определяется следующим образом: я с двумя столовыми ItemType и товарыSQL Query требуется с помощью КТР

Itemtype 
------------------- 
ItemTypeID ItemParent TypeName 
------------------------------- 
1   0   XXX 
2   1   YYY 
3   1   ZZZ 
4   0   SSS 
5   4   GGG 

Items 
-------------------- 
ItemID ItemTypeID ItemCost 
---------------------------------- 
1  1   5000 
2  2  1000 
3  4  250 
4  3  2000 
5  5  400 

Output 
--------------------------- 
ItemtypeName ItemCost 
------------------------------ 
XXX   8000 (1000+5000+2000) 
SSS   650 (250+400) 

Эти две таблицы: Я присоединился как таблицу, используя itemtypeid. Теперь мне нужно отобразить Элементы с ItemParentId = 0 и рассчитать Itemcost элементов с ItemtypeId и ItemparentTypeId, имеющих значение, такое же, как ItemTypeID.

Я написал запрос с использованием CTE, но не отобразил ItemTypeName.

WITH it_cte AS (select itemtypeid from ItemType WHERE 
ItemType.ItemParentType IS NULL UNION ALL select i.ItemTypeid from 
ItemType i INNER JOIN it_cte icte ON icte.itemtypeid = i.itemtypeid) 
select ItemParentType,SUM(Items.ItemCost) as itemcost from ItemType 
left join Items on ItemType.ItemTypeID = Items.ItemTypeID or 
ItemType.ItemParentType= Items.ItemTypeID group by 
ItemType.ItemParentType 

Может ли кто-нибудь помочь?

Благодаря Jamuna

+0

Вы заявление не соответствует вашему примеру. В вашем примере нет элемента ItemParentType и значений 'NULL'. Можно ли предположить, что 'ItemParentType' является' ItemParent' и что '0' должно быть' NULL'? –

ответ

3

После заявления

  • использует CTE, чтобы получить список всех ItemTypeID с корнем ItemTypeID
  • соединяется с ItemType, чтобы получить TypeName
  • присоединяются Items к получить ItemCost
  • группы по TypeName, чтобы получить сумму ItemCost

SQL Заявление

;WITH q AS (
    SELECT ItemTypeID , Root = ItemTypeID 
    FROM ItemType 
    WHERE ItemParent = 0 
    UNION ALL 
    SELECT t.ItemTypeID, q.Root 
    FROM q 
      INNER JOIN ItemType t ON t.ItemParent = q.ItemTypeID 
) 
SELECT it.TypeName, SUM(i.ItemCost) 
FROM q 
     INNER JOIN ItemType it ON it.ItemTypeID = q.Root 
     INNER JOIN Items i ON i.ItemTypeID = q.ItemTypeID 
GROUP BY 
     it.TypeName   

тестовый скрипт

;WITH ItemType (ItemTypeID, ItemParent, TypeName) AS (
    SELECT 1, 0, 'XXX' UNION ALL 
    SELECT 2, 1, 'yyy' UNION ALL 
    SELECT 3, 1, 'ZZZ' UNION ALL 
    SELECT 4, 0, 'SSS' UNION ALL 
    SELECT 5, 4, 'GGG' 
) 
, Items (ItemID, ItemTypeID, ItemCost) AS (
    SELECT 1, 1, 5000 UNION ALL 
    SELECT 2, 2, 1000 UNION ALL 
    SELECT 3, 4, 250 UNION ALL 
    SELECT 4, 3, 2000 UNION ALL 
    SELECT 5, 5, 400 
) 
, q AS (
    SELECT ItemTypeID , Root = ItemTypeID 
    FROM ItemType 
    WHERE ItemParent = 0 
    UNION ALL 
    SELECT t.ItemTypeID, q.Root 
    FROM q 
      INNER JOIN ItemType t ON t.ItemParent = q.ItemTypeID 
) 
SELECT it.TypeName, SUM(i.ItemCost) 
FROM q 
     INNER JOIN ItemType it ON it.ItemTypeID = q.Root 
     INNER JOIN Items i ON i.ItemTypeID = q.ItemTypeID 
GROUP BY 
     it.TypeName   
+0

Спасибо, человек! Очень приятно объяснил! –

+0

Я также пытался предложить ответ тем временем, но я знаю, что я бы только придумал решение, но вы это объяснили достаточно хорошо! –

+0

Отличная работа, Большое спасибо –

Смежные вопросы