Создать таблицу temp на основе выбрать distinct на 3 колоннах, но с 1 дополнительной колонкой

Мне нужно сделать в нем временный файл:

Код детали, Дата мутации, Тип движения, Кол-во

Каждый код детали имеет несколько дат мутации для каждого типа движения (возможно максимум 9 типов движения). Мне нужно получить последнюю дату мутации для каждого типа движения для каждого кода детали и соответствующее количество.

Пример с кодом детали 003307

003307 2018-05-31 1 -100
003307 2018-06-11 2 -33
003307 2018-04-25 3 +25

и так далее для всех 9 типов движения.

Что я получил до сих пор:

create table #LMUT(
    MutationDate T_Date
    ,PartCode T_Code_Part
    ,CumInvQty T_Quantum_Qty10_3
    ,MovementType T_Type_PMOverInvt
    )

    insert #LMUT(
    MutationDate,
    Partcode,
    CumInvQty,
    MovementType)
    SELECT
    cast (max(MOV.MutationDate) as date)
    ,MOV.PartCode
    ,INV.MutationQty
    ,INV.PMOverInvtType
    FROM dbo.T_PartMovementMain as MOV
    inner join dbo.T_PartMovementOverInvt as INV on

INV.PMMainCode=MOV.PMMainCode
        WHERE
        MOV.PartMovementType = 1
        group by MOV.PartCode,INV.PMOverInvtType,INV.MutationQty,MOV.MutationDate

SELECT * FROM #LMUT where partcode='003007'
drop table #LMUT

приводит к:

    2016-12-06 00:00:00.000 003007 -24.000 2
    2016-09-29 00:00:00.000 003007 -24.000 2
    2016-11-09 00:00:00.000 003007 -24.000 2
    2016-11-22 00:00:00.000 003007 -24.000 2
    2016-10-26 00:00:00.000 003007 -24.000 2
    2016-09-12 00:00:00.000 003007 -42.000 2
    2016-10-13 00:00:00.000 003007 -24.000 2
    2016-12-03 00:00:00.000 003007 100.000 5
    2017-01-12 00:00:00.000 003007 -48.000 2
    2016-10-04 00:00:00.000 003007 306.000 7

Не то, что мне нужно, еще 8 раз типа 2

Что еще пробовал:

SELECT distinct MOV.Partcode,INV.PMOverInvtType,mov.MutationDate
        FROM dbo.T_PartMovementMain as MOV
        inner join dbo.T_PartMovementOverInvt as INV on
        INV.PMMainCode=MOV.PMMainCode
        WHERE
        mov.MutationDate = (SELECT MAX (c.MutationDate) FROM
        dbo.T_PartMovementMain as c
        inner join dbo.T_PartMovementOverInvt as d on D.PMMainCode=c.PMMainCode
                             WHERE
                                     C.PartMovementType = 1 AND
                                     C.PartCode=mov.PartCode AND
                                     D.PMMainCode = C.PMMainCode AND
                                     D.PMOverInvtType=inv.PMOverInvtType                                     
                                    )        
         and MOV.PartMovementType = 1 and mov.partcode='003007'
        order by MOV.Partcode,INV.PMOverInvtType

Результаты в:

3007    2   2017-01-12 00:00:00.000
3007    5   2016-12-03 00:00:00.000
3007    7   2016-10-04 00:00:00.000

Это то, что я хочу, но мне тоже нужно получить Кол-во.

1
0
134
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

использовать функцию окна row_number()

   with cte as

(         SELECT  MOV.*,INV.*,
          row_number() over(partition by INV.PMOverInvtType order by MOV.MutationDate desc)rn
            FROM dbo.T_PartMovementMain as MOV
            inner join dbo.T_PartMovementOverInvt as INV on
            INV.PMMainCode=MOV.PMMainCode
) select cte.* from cte where rn=1

Оно работает! Спасибо. Я никогда не слышал об этой функции «with» и row_number.

saho 31.10.2018 15:04

с cte как (SELECT MOV.Partcode, INV.PMOverInvtType, mov.MutationDate, INV.Mutatio‌ nQty, row_number () over (разделение по MOV.Partcode, INV.PMOverInvtType order by MOV.Partcode, INV.MOverInvtTypeD desc) rn FROM dbo.T_PartMovementMain как внутреннее соединение MOV dbo.T_PartMovementOverInvt как INV на INV.PMMainCode = MOV.PMMainCode) выберите cte. * from cte, где rn = 1 Это код, который я использую сейчас.

saho 31.10.2018 15:05

Решил это так:

  create table #LMUT(
   PartCode     T_Code_Part
   ,MovementType T_Type_PMOverInvt
   ,MutationDate T_Date 
   ,CumInvQty    T_Quantum_Qty10_3
   )

insert #LMUT(Partcode,MovementType,MutationDate,CumInvQty)
    select Artikel,Type,Datum,Aant
    from (
        SELECT  MOV.Partcode as Artikel,INV.PMOverInvtType as Type,mov.MutationDate as Datum,INV.MutationQty as Aant,
          row_number() over(partition by MOV.Partcode,INV.PMOverInvtType order by MOV.Partcode,INV.PMOverInvtType,MOV.MutationDate desc) rn
            FROM dbo.T_PartMovementMain as MOV
            inner join dbo.T_PartMovementOverInvt as INV on INV.PMMainCode=MOV.PMMainCode) cse
    where rn=1
select * from #LMUT  order by Partcode  
drop table #LMUT

Другие вопросы по теме