2015-12-17 4 views
1

У меня есть две таблиц:Одда Ошибки при создании вида сводной таблицы (SQL)

таблица 1: MSVTransaction

таблица 2: [MonthlySalary]

Я хотел бы создать сводную таблицу сравнение количества сотрудников между двумя таблицами:

select 
     [MSV_EntitledIdNumber], 
     [MS_Semel], 
     sum(case when [MSV_Month] in (1) then [MSV_PaymentAmount] else 0 end) as JanMSV, 
     sum(case when [MS_Month] in (1) then [MS_Amount] else 0 end) as JanSML, 
     sum(case when [MSV_Month] in (2) then [MSV_PaymentAmount] else 0 end) as FebMSV, 
     sum(case when [MS_Month] in (2) then [MS_Amount] else 0 end) as FebSML, 
     sum(case when [MSV_Month] in (3) then [MSV_PaymentAmount] else 0 end) as MarMSV, 
     sum(case when [MS_Month] in (3) then [MS_Amount] else 0 end) as MarSML, 
     sum(case when [MSV_Month] in (4) then [MSV_PaymentAmount] else 0 end) as AprMSV, 
     sum(case when [MS_Month] in (4) then [MS_Amount] else 0 end) as AprSML, 
     sum(case when [MSV_Month] in (5) then [MSV_PaymentAmount] else 0 end) as MayMSV, 
     sum(case when [MS_Month] in (5) then [MS_Amount] else 0 end) as MaySML, 
     sum(case when [MSV_Month] in (6) then [MSV_PaymentAmount] else 0 end) as JunMSV, 
     sum(case when [MS_Month] in (6) then [MS_Amount] else 0 end) as JunSML, 
     sum(case when [MSV_Month] in (7) then [MSV_PaymentAmount] else 0 end) as JulMSV, 
     sum(case when [MS_Month] in (7) then [MS_Amount] else 0 end) as JulSML, 
     sum(case when [MSV_Month] in (8) then [MSV_PaymentAmount] else 0 end) as AugMSV, 
     sum(case when [MS_Month] in (8) then [MS_Amount] else 0 end) as AugSML, 
     sum(case when [MSV_Month] between 1 and 8 then [MSV_PaymentAmount] else 0 
    from [dbo].[MSVTransaction] as msv 
    left join [dbo].[MonthlySalary] as SmlTbl on SmlTbl.[MS_InfoEmpNum] = 
    msv.MSV_EntitledIdNumber And SmlTbl.MS_Month = msv.MSV_Month 
    Where SmlTbl.[MS_MSF_Code] between 4 and 27 and 
    SmlTbl.[MS_Semel] = '666' And msv.[MSV_EntitledIdNumber]= 55555 
    and msv.[MSV_MSVT_CodeID] not between 198 and 213 
    group by [MSV_EntitledIdNumber],[MS_Semel] 

Когда я запускаю это я получаю:

MSV_EntitledIdNumber MS_Semel   JanMSV JanSML FebMSV FebSML MarMSV MarSML AprMSV AprSML MayMSV MaySML   JunMSV JunSML JulMSV JulSML AugMSV AugSML 
    55555    666  2000 2000 5000 5000 6000 6000 8000 8000 7000 7000      80000 160000 15000 30000 14000 14000 

Я хотел бы обратить ваше внимание на следующее:

JunMSV JunSML JulMSV JulSML where the amounts are diffrent between one and other. 

Похоже, сумма в monthlySalary получил двойной (15К * 2 за июль и 80K * 2 за июнь) - почему? Исходные данные:

[MonthlySalary]

MS_InfoEmpNum MS_Semel MS_Month MS_Amount 
55555    666   1   2000 
55555    666   2   5000 
55555    666   3   6000 
55555    666   4   8000 
55555    666   5   7000 
55555    666   6   80000 
55555    666   7   15000 
55555    666   8   14000 

И MSVTransaction:

MSV_EntitledIdNumber MSV_PaymentAmount MSV_Month 
55555      2000    1 
55555      5000    2 
55555      6000    3 
55555      8000    4 
55555      7000    5 
55555      75000    6 
55555      5000    6 
55555      4000    7 
55555      11000    7 
55555      14000    8 

Похоже, проблема возникла в строках, где есть две записи и код просто суммируя два раза, но взять то же количество. Оно должно было быть 20000 в июле и 85K в июне, и в этом случае поля msv и sml равны. Любая помощь в его устранении? Большое спасибо!

ответ

1

У вас есть повторяющиеся месяцы в таблице MSVTransaction. Следовательно, значения умножаются. Хорошим методом для решения этой проблемы является агрегация перед выполнением объединения. Пункт from будет выглядеть так:

from [dbo].[MSVTransaction] msv left join 
    (select MSV_EntitledIdNumber, MS_Month, 
      sum(MSV_PaymentAmount) as MSV_PaymentAmount 
     from [dbo].[MonthlySalary] SmlTbl 
     group by msv.MSV_EntitledIdNumber, SmlTbl.MS_Month 
    ) smlTbl 
    on SmlTbl.[MS_InfoEmpNum] = msv.MSV_EntitledIdNumber And 
     SmlTbl.MS_Month = msv.MSV_Month 
+0

Гордон, спасибо, но я думаю, что некоторые из полей, которые вы написали, не являются корректными. Сумма должна быть в MSVTransaction? – Jordan1200

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