2015-12-16 8 views
3

У меня есть 2 Select Statement, но мне нужно объединить оба результата и показать PRIMARY_MATERIAL рядом с столбцом SECONDARY_MATERIAL. В настоящее время я использую UNION, который отображает все в строках (около 300 строк), но мне действительно нужно всего 150 строк, и вместо этого нужно отображать их в дополнительных столбцах.Merge Select Statement в SQL

SELECT RM_Materials.MaterialCode MatCode, 
     RM_MRPAttributeDefinitions.ShortDescription ProcessArea, 
     RM_MRPAttributes.AttributeValue AttValue 
FROM DMI_Manu32.dbo.RM_MRPAttributeDefinitions 
     INNER JOIN (DMI_Manu32.dbo.RM_Materials 
        INNER JOIN DMI_Manu32.dbo.RM_MRPAttributes 
          ON (RM_Materials.MaterialUID = RM_MRPAttributes.MaterialUID) 
           AND (RM_Materials.InternalVersionNo = RM_MRPAttributes.MaterialVersionNo)) 
       ON RM_MRPAttributeDefinitions.MRPAttributeDefinitionsUID = RM_MRPAttributes.MRPAttributeDefinitionsUID 
WHERE RM_Materials.ActiveTF = 1 
     AND RM_MRPAttributes.ActiveTF = 1 
     AND "RM_MRPAttributeDefinitions"."ActiveTF" = 1 
     AND "RM_Materials"."DeletedTF" = 0 
     AND "RM_MRPAttributeDefinitions"."ShortDescription" = N'PRIMARY_MATERIAL' 
     AND "RM_Materials".ActiveTF = 1 
UNION 
SELECT RM_Materials.MaterialCode MatCode, 
     RM_MRPAttributeDefinitions.ShortDescription ProcessArea, 
     RM_MRPAttributes.AttributeValue AttValue 
FROM DMI_Manu32.dbo.RM_MRPAttributeDefinitions 
     INNER JOIN (DMI_Manu32.dbo.RM_Materials 
        INNER JOIN DMI_Manu32.dbo.RM_MRPAttributes 
          ON (RM_Materials.MaterialUID = RM_MRPAttributes.MaterialUID) 
           AND (RM_Materials.InternalVersionNo = RM_MRPAttributes.MaterialVersionNo)) 
       ON RM_MRPAttributeDefinitions.MRPAttributeDefinitionsUID = RM_MRPAttributes.MRPAttributeDefinitionsUID 
WHERE RM_Materials.ActiveTF = 1 
     AND RM_MRPAttributes.ActiveTF = 1 
     AND "RM_MRPAttributeDefinitions"."ActiveTF" = 1 
     AND "RM_Materials"."DeletedTF" = 0 
     AND "RM_MRPAttributeDefinitions"."ShortDescription" = N'SECONDARY_MATERIAL' 
     AND "RM_Materials".ActiveTF = 1 
+0

Есть ли у вас какие-либо дубликаты для удаления? В противном случае сделайте 'UNION ALL', чтобы получить все строки, быстрее. – jarlh

+0

У меня нет дубликатов для удаления. К сожалению, использование UNION или UNION ALL возвращает все в строке. Мне нужна колонка, отображающая AttValue для PRIMARY_MATERIAL, а еще один столбец рядом с ней, показывающий AttValue для SECONDARY_MATERIAL, для каждого MatCode. – tomred1979

ответ

0

Я думаю, что условное агрегирование будет делать то, что вы хотите. Однако ваш запрос довольно сложно выполнить. Я думаю, что это решение:

SELECT m.MaterialCode as MatCode, 
     d.ShortDescription as ProcessArea, 
     MAX(CASE WHEN ShortDescription = N'PRIMARY_MATERIAL' THEN a.AttributeValue 
      END) as PrimaryMaterial_AttValue, 
     MAX(CASE WHEN ShortDescription = N'SECONDARY_MATERIAL' THEN a.AttributeValue 
      END) as SecondaryMaterial_AttValue 
FROM DMI_Manu32.dbo.RM_Materials m INNER JOIN 
    DMI_Manu32.dbo.RM_MRPAttributes a 
    ON m.MaterialUID = a.MaterialUID AND m.InternalVersionNo = a.MaterialVersionNo INNER JOIN 
    DMI_Manu32.dbo.RM_MRPAttributeDefinitions d 
    ON d.MRPAttributeDefinitionsUID = a.MRPAttributeDefinitionsUID 
WHERE m.ActiveTF = 1 AND a.ActiveTF = 1 AND 
     d.ActiveTF = 1 AND 
     m.DeletedTF = 0 
GROUP BY m.MaterialCode, d.ShortDescription; 

Примечание:

  • Таблица псевдонимы сделать запрос гораздо легче читать и писать.
  • Скобки в статье FROM не нужны, в общем. И, с INNER JOIN, они никогда не нужны. Скобки обычно вызывают путаницу.
  • Нет необходимости повторять условия в предложении WHERE (например, "RM_Materials".ActiveTF=1).
+0

Спасибо, Гордон, я согласен с псевдонимами. Я получаю сообщение об ошибке, Msg 102, Level 15, State 1, Line 5 Неверный синтаксис рядом с «MAX». Я попробовал несколько изменений, и они не сработали. Любые идеи, чтобы обойти эту ошибку? Спасибо, мельница. – tomred1979

+0

Это должно быть запятая в конце предыдущей строки. (Я отредактирую.) – jarlh

+0

Отсутствует таблица в последнем INNER JOIN ... Нет, подождите, просто удалите это 'INNER JOIN' непосредственно после' ON'? – jarlh

0

Только один запрос с:

AND "RM_MRPAttributeDefinitions"."ShortDescription" IN (N'PRIMARY_MATERIAL',N'SECONDARY_MATERIAL') 

Думай, что может дать вам то, что вы ищете

+0

Я хочу держаться подальше от Союза, поскольку Союз отображает все в 3 колонках. Где, как я хочу отображать результаты в 5 или 6 столбцах, бок о бок. Любые другие предложения? – tomred1979