2016-02-08 7 views
6

chcę do obliczenia wynagrodzenia za każdy wróg pracowników każdego miesiąca, więcobliczyć całkowite wynagrodzenie w oparciu o typ pracownika

Mam dwie tabele i dwa widoki, które wygląda tak

Employees_View

| ID | Name | PayRate | PayUnitCode | Commission | 
|----|-------|---------|-------------|------------| 
| 1 | James |  10 |   C |   0 | 
| 2 | Mike | 10000 |   S |   0 | 
| 3 | Jude | 20000 |   SC |   5 | 
| 4 | Clara |  8 |   C |   0 | 

Praca

| id |    Created | 
|----|---------------------| 
| 1 | 01/21/2016 10:56:05 | 
| 2 | 01/21/2016 10:56:05 | 
| 3 | 01/21/2016 10:56:05 | 
| 4 | 01/21/2016 10:56:05 | 
| 5 | 01/21/2016 12:11:59 | 
| 6 | 01/25/2016 08:03:07 | 
| 7 | 11/01/2015 22:55:22 | 

Job_Items_View

| Job_ID | Amount | Emp_ID | 
|--------|--------|--------| 
|  1 | 135 |  4 | 
|  1 | 500 |  2 | 
|  3 | 1500 |  2 | 
|  3 | 250 |  4 | 
|  4 | 1000 |  2 | 
|  5 | 500 |  4 | 
|  6 | 500 |  4 | 
|  7 | 1000 |  1 | 

PayUnits

| Code |     Name | 
|------|------------------------| 
| S |     Salary | 
| C |    Commission | 
| SC | Salary plus Commission | 

Mam SQL FIDDLE tutaj z danymi

kiedy wykonać kwerendę

DECLARE @startDateTime DATETIME = '2015-11-01 00:00:00' 
DECLARE @endDateTime DATETIME = '2016-02-28 23:59:59' 

;WITH sales AS 
(
    SELECT 
    ev.ID, 
    ISNULL(SUM(jiv.Amount), 0) AS TotalSales, 
    MONTH(j.Created) AS [Month], 
    YEAR(j.Created) AS [Year] 
    FROM Employees_View AS ev 
    LEFT JOIN Job_Items_View AS jiv ON jiv.Emp_ID = ev.ID 
    LEFT JOIN Jobs AS j ON j.ID = jiv.Job_ID 
    WHERE j.Created BETWEEN @startDateTime AND @endDateTime 
    GROUP BY 
    ev.ID, 
    MONTH(j.Created), 
    YEAR(j.Created) 
), 
commissions AS 
(
    SELECT 
    s.ID, 
    CASE ev.PayUnitCode 
     WHEN 'C' THEN s.TotalSales * (ev.PayRate/100) 
     WHEN 'SC' THEN (SELECT SUM(Amount) FROM Job_Items_View) * (ev.Commission/100) 
     ELSE 0 
    END AS TotalCommission 
    FROM sales AS s 
    JOIN Employees_View AS ev ON ev.ID = s.ID 
), 
salaries AS 
(
    SELECT 
    ID, 
    CASE PayUnitCode 
     WHEN 'C' THEN 0 
     ELSE PayRate 
    END AS Salary 
    FROM Employees_View 
), 
totals AS 
(
    SELECT 
    salaries.ID, 
    ISNULL(sales.Month, MONTH(@startDateTime)) AS [Month], 
    ISNULL(sales.Year, YEAR(@startDateTime)) AS [Year], 
    ISNULL(sales.TotalSales, 0) AS TotalSales, 
    salaries.Salary, 
    ISNULL(commissions.TotalCommission, 0) AS TotalCommission 
    FROM salaries 
    LEFT JOIN sales ON salaries.ID = sales.ID 
    LEFT JOIN commissions ON commissions.ID = sales.ID 
) 
SELECT 
    ev.PayRate, 
    ev.Name, 
    t.Salary + t.TotalCommission AS Pay, 
    LEFT(DATENAME(MONTH, DATEADD(MONTH , t.[Month], -1)), 3) 
    + '-' + CAST(t.[Year] AS VARCHAR) AS [Month], 
    ev.ID AS Emp_ID, 
    pu.Name AS PayUnit, 
    ev.Commission 
FROM totals AS t 
JOIN Employees_View AS ev ON ev.ID = t.ID 
JOIN PayUnits AS pu ON pu.Code = ev.PayUnitCode 

uzyskać

| PayRate | Name | Pay | Month | Emp_ID |    PayUnit | Commission | 
|---------|-------|-------|----------|--------|------------------------|------------| 
|  10 | James | 100 | Nov-2015 |  1 |    Commission |   0 | 
| 10000 | Mike | 10000 | Jan-2016 |  2 |     Salary |   0 | 
| 20000 | Jude | 20000 | Nov-2015 |  3 | Salary plus Commission |   5 | 
|  8 | Clara | 110.8 | Jan-2016 |  4 |    Commission |   0 | 

spodziewam się dostać

| PayRate | Name | Pay | Month | Emp_ID |    PayUnit | Commission | 
|---------|-------|--------|----------|--------|------------------------|------------| 
|  10 | James | 100 | Nov-2015 |  1 |    Commission |   0 | 
| 10000 | Mike | 10000 | Jan-2016 |  2 |     Salary |   0 | 
| 2000 | Jude |20269.25| Nov-2015 |  3 | Salary plus Commission |   5 | 
|  8 | Clara | 110.8 | Jan-2016 |  4 |    Commission |   0 | 

Dla PayUnit.Code = C (Komisji), płatne = łączna sprzedaż * (employee.Payrate/100)

Dla PayUnit.Code = S (wynagrodzenia), płatna = employee.Payrate

Dla PayUnit.Code = SC (wynagrodzenie plus prowizja), Pay = employee.Payrate + (całkowitej sprzedaży * (employee.Commission/100))

należy wziąć pod uwagę Judes zapłacić co 20269,25 zamiast 20000 w poprzedniej tabeli

+0

Dołącz swoje dane i wyjaśnić logikę w samej – Amit

+1

danych został dodany – Smith

+0

pytanie jaka jest logika za obliczeniem? – Amit

Odpowiedz

1

Dzieje się tak, ponieważ wykluczysz Jude z CTE sprzedaży podczas filtrowania całego połączonego zestawu rekordów według okresu (pomimo LEWEGO DOŁĄCZENIA), a zatem prowizja nie jest obliczana na podstawie jej rekordu w prowizji CTE. Zamiast tego, należy zastosować filtr tylko do pracy podzbioru tak:

WITH sales AS 
(
    SELECT 
    ev.ID, 
    ISNULL(SUM(jiv.Amount), 0) AS TotalSales, 
    MONTH(j.Created) AS [Month], 
    YEAR(j.Created) AS [Year] 
    FROM Employees_View AS ev 
    LEFT JOIN Job_Items_View AS jiv ON jiv.Emp_ID = ev.ID 
    LEFT JOIN 
    (select * from jobs WHERE Created BETWEEN @startDateTime AND @endDateTime) as j ON j.ID = jiv.Job_ID 
    GROUP BY 
    ev.ID, 
    MONTH(j.Created), 
    YEAR(j.Created) 
) 

Oto updated SQLFiddle

+0

Chcę obliczyć wynagrodzenie dla każdego pracownika za każdy miesiąc, wynagrodzenie nie zmienia wynagrodzenia, ale powinno się zmienić na prowizję i wynagrodzenie plus pracowników prowizji. spróbuj zmienić daty w zapytaniu i zobaczyć błąd. – Smith

+0

@Smith Cóż, to już inna historia. Uprościliśmy twoje zapytanie, które można znaleźć w [zaktualizowanym skrzypcach] (http://sqlfiddle.com/#!3/f4be2/78). Jeśli dobrze zrozumiałem, musisz wyliczać miesięczne wynagrodzenia i prowizje na podstawie sprzedaży za miesiąc, ale nawet jeśli są jakieś nieporozumienia po mojej stronie, możesz użyć kodu w skrzypcach, aby uzyskać to, czego potrzebujesz. – nanestev

Powiązane problemy