2013-07-31 6 views
2

У вас был взгляд и, возможно, неправильный способ, но я не могу найти связанный с ним вопрос.Сумма определенных записей в одной таблице на основе записей из 3 полей

У меня есть таблица, которая имеет 4 поля, идентификатор, который предназначен для другой записи, а затем тип затрат, тип и сумма доплаты.

Нужно иметь возможность добавить поле суммы двух видов затрат по одному из типов Дополнения для одного из ID.

PCM_ID COST_TYPE  SUPPLEMENT_TYPE AMOUNT 
----------------------------------------------------- 
2238 AGENT   SS     85.785 
2238 DBCOST   SS    77.9891 
2238 DBCOST_TAX  SS     7.7989 
2238 DBSELL   SS     85.785 
2238 DBSELL_TAX  SS     8.5785 
2238 PCCOM_TAX  SS      0 
2238 PCMUP_TAX  SS      0 
2238 RETAIL   SS     85.785 

Итак, мы добавили DBCOST и DBCOST_TAX для дополнения SS.

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

Мои умения SQL очень ограничены и в основном я преподаю, поэтому вот что я до сих пор.

SELECT SUM (pcs.amount) 
    FROM dbo.PCS 
    JOIN dbo.pcm ON pcm.pcm_id = PCS.PCM_ID 
WHERE pcs.pcm_id = pcm.pcm_id 
    and pcs.supplement_type = 'SS' 
    AND pcs.cost_type IN ('DBCOST','DBCOST_TAX') 

Это часть более крупного запроса, но только проблема с этой частью.

Надеюсь, здесь имеется достаточно информации, что вы можете мне помочь.

Добавление к этому 10 авг

Ниже приведен сценарий, как мне нужно, меньше несколько полей, которые являются прямыми данными.

Select 
    ID=pcm.pcm_id, 
    Name=pcm.name, 
    Half_TW_Cost=(SELECT round (SUM(ppc.pax_tw),2) FROM dbo.ppp 
     JOIN dbo.ppc ON ppp.ppp_id = ppc.ppp_id 
     WHERE pcp.pcp_id = ppp.pcp_id AND ppc.cost_type IN ('DBCOST','DBCOST_TAX')), 
    Half_TW_Sell=(SELECT round (SUM(ppc.pax_tw),2) FROM dbo.ppp 
     JOIN dbo.ppc ON ppp.ppp_id = ppc.ppp_id 
     WHERE pcp.pcp_id = ppp.pcp_id AND ppc.cost_type IN  
     ('AGENT','DBSELL_TAX','PCMUP_TAX','PCCOM_TAX')), 
    SS_Cost=(SELECT round (SUM (pcs.amount),2) FROM dbo.PCS 
     JOIN dbo.pcm ON pcm.pcm_id = PCS.PCM_ID 
     WHERE pcs.pcm_id = pcm.pcm_id AND pcs.supplement_type = 'SS' AND pcs.cost_type 
     IN ('DBCOST','DBCOST_TAX')), 
    Range_Seq=pcp.seq, 
    Pax_Range=pcp.pxno 
FROM dbo.pcm 
LEFT JOIN dbo.pcp ON pcp.pcm_id = pcm.pcm_id 
where pcm.pcm_id = 2238 
group by PCM.PCM_ID, pcm.NAME, pcp.PCP_ID, pcp.SEQ, pcp.PXNO 

Результаты я получить следующим образом:

ID  Name     Half_TW_Cost Half_TW_Sell SS_Cost  Range_Seq Pax_Range 
----------------------------------------------------------------------------------------- 
2238 Brett test PCM Output 106.1200  117.5300  546913.1800 1   10 
2238 Brett test PCM Output 99.7200  110.2400  546913.1800 2   15 
2238 Brett test PCM Output 96.2400  106.2700  546913.1800 3   20 
2238 Brett test PCM Output 94.1500  103.8900  546913.1800 4   25 
2238 Brett test PCM Output 88.5900  102.3000  546913.1800 5   30 
2238 Brett test PCM Output 92.6100  103.2300  546913.1800 6   2 

Значение для SS_Cost является общей для таблицы, а не для PCM_ID. Значение, которое я получаю после: 85.79, которое является DBCOST + DBCOST_TAX. Я знаю, что это значение агента выше, но это не включает разметку в этой записи, и поэтому это изменится, поэтому мне действительно нужны DBCOST и TAX. Также я не могу исчислять налог, поскольку некоторые услуги не имеют налога, так что это не всегда 10%. Любая помощь только для того, чтобы SS_Cost была значением для отдельного PCM, была бы оценена.

+0

Вы имеете в виду обновление или просто выбрать? Отправьте желаемый результат для данных образца. Кроме того, какие RDBMS вы используете. –

+0

Мои навыки SQL также очень ограничены. Сказав это, то, что вы написали, выглядит хорошо ... что именно происходит неправильно? Верно ли возвращаемое значение? – munyul

+0

Удалите самые внешние(). Добавьте 'PCM_ID, Cost_type, Supplement_type' после SELECT и:' GROUP BY PCM_ID, Cost_type, Supplement_type' в конце. – makciook

ответ

0

Может быть, это то, что вы ищете:

(SELECT 
    PCS.PCM_ID, SUM (pcs.amount) 
FROM 
    dbo.PCS 
    JOIN 
    dbo.pcm ON pcm.pcm_id = PCS.PCM_ID 
WHERE 
    pcs.pcm_id = pcm.pcm_id 
    AND 
    pcs.supplement_type = 'SS' 
    AND 
    pcs.cost_type IN ('DBCOST','DBCOST_TAX') 
GROUP BY 
    PCS.PCM_ID) 

Я надеюсь, что это помогает :)

EDIT (16.Aug)
Я создал следующий код, скопированный из вашего заявления выше и она выполняется без ошибок (он не имеет никаких данных, но это не имеет значения)

DECLARE @pcm TABLE(pcm_id INT IDENTITY(1,1), name NVARCHAR(MAX)) 
DECLARE @pcp TABLE(pcp_id INT IDENTITY(1,1), pcm_id INT, seq NVARCHAR(MAX), pxno NVARCHAR(MAX)) 
DECLARE @ppc TABLE(ppc_id INT IDENTITY(1,1), ppp_id INT, cost_type NVARCHAR(MAX), pax_tw FLOAT) 
DECLARE @ppp TABLE(ppp_id INT IDENTITY(1,1), pcp_id INT) 
DECLARE @pcs TABLE(ppc_id INT IDENTITY(1,1), pcm_id INT, ppp_id INT, cost_type NVARCHAR(MAX), supplement_type NVARCHAR(MAX), amount FLOAT) 

SELECT 
    ID=pcm.pcm_id, Name=pcm.name, 
    Half_TW_Cost= 
    (
     SELECT 
      ROUND(SUM(ppc.pax_tw), 2) 
     FROM 
      @ppp AS ppp 
      JOIN 
      @ppc AS ppc ON ppp.ppp_id = ppc.ppp_id 
     WHERE 
      pcp.pcp_id = ppp.pcp_id 
      AND 
      ppc.cost_type IN ('DBCOST', 'DBCOST_TAX') 
    ), 
    Half_TW_Sell= 
    (
     SELECT 
      ROUND(SUM(ppc.pax_tw), 2) 
     FROM 
      @ppp AS ppp 
      JOIN 
      @ppc AS ppc ON ppp.ppp_id = ppc.ppp_id 
     WHERE 
      pcp.pcp_id = ppp.pcp_id 
      AND 
      ppc.cost_type IN ('AGENT', 'DBSELL_TAX', 'PCMUP_TAX', 'PCCOM_TAX') 
    ), 
    SS_Cost= 
    (
     SELECT 
      ROUND(SUM(pcs.amount), 2) 
     FROM 
      @pcs AS pcs 
      JOIN 
      @pcm AS pcm ON pcm.pcm_id = pcs.pcm_id 
     WHERE 
      pcs.pcm_id = pcm.pcm_id 
      AND 
      pcs.supplement_type = 'SS' 
      AND 
      pcs.cost_type IN ('DBCOST','DBCOST_TAX') 
    ), 
    Range_Seq=pcp.seq, Pax_Range=pcp.pxno 
FROM 
    @pcm AS pcm 
    LEFT JOIN 
    @pcp AS pcp ON pcp.pcm_id = pcm.pcm_id 
WHERE 
    pcm.pcm_id = 2238 
GROUP BY 
    pcm.pcm_id, pcm.name, pcp.pcp_id, pcp.seq, pcp.pxno 

Если это не работает для вас, какая база данных (includin g) вы используете?

+0

Привет, Munyul, Это дает мне результат, который я ищу, когда выполняется как есть, но когда я добавляю его во весь запрос, я получаю следующую ошибку: Msg 116, Level 16, State 1, Line 19 Можно указать только одно выражение в списке выбора, когда подзапрос не вводится с EXISTS. То, что я пытаюсь достичь, - это запрос, который может быть запущен на листе excel как пользовательский отчет, компания-разработчик программного обеспечения в качестве соединителя, который получает информацию из БД, а затем ее можно организовать в сводной таблице. Полный запрос - это то, что я пытаюсь собрать, и я думаю, что он выходит за рамки моего набора навыков SQL. Спасибо за вашу помощь. – Ozbear

+0

Как я уже сказал, я тоже не эксперт по SQL, и, не видя всего заявления, я ничего не могу добавить ... – munyul

+0

Я добавил к оригиналу более подробную информацию, если кто-нибудь может помочь. – Ozbear

0

Не храните сумму налога вообще? Похоже, что это 10% стоимости, так почему бы вам просто не рассчитать, когда вы тянете свой отчет?

1

Позвольте мне объяснить мое решение.

grouped_pcm_sums Это может быть взгляд. SQL 2008 поддерживает CTE, который я использую здесь. Мне нравится разбивать проблему отдельно, а не решать в одном запросе.Здесь просто получить суммы для точных данных, которые вы ищете, и иметь правильный идентификатор, чтобы вернуться к нему в своем запросе.

Если вы только хотите СУММЫ ЗА 2238 Я не был уверен, из вашего поста, но если речь идет о том, что независимо от того, PCM_ID вы сообщаете о, всегда сообщают суммы SS для 2238 ..., то вы можете раскомментируйте прокомментированные строки и торгуйте соединение с помощью креста, чтобы поднять значение до остальной части вашего отчета.

grouped_sell_values, grouped_cost_values ​​ Это могут быть виды. Если я правильно заметил, вы ссылаетесь на свой внешний запрос из этого вспомогательного запроса в таблице pcp. Вместо этого вы должны иметь возможность группировать этот pcp_id в этих отдельных операциях, а затем присоединяться к ним позже.

левые соединения Возможно, вам не нужны левые соединения, и left можно опустить, если вам нужны только строки, в которых существуют отношения. Поскольку вы выполнили свою группировку в другом месте, больше не нужно группировать другие поля, чтобы они попали в ваше предложение select. Вы можете добавлять информационные поля и последующие объединения данных по своему желанию. Просто обратите внимание на количество строк, чтобы гарантировать, что дополнительные соединения не будут толкать ваши результаты неожиданно.

И наконец Я округляю последнее. Проверяйте опечатки и проверяйте каждый CTE отдельно, чтобы убедиться, что они дают правильные результаты. Принимая это в небольших кусках, вы можете устранить простой SQL вместо одного очень большого SQL.

with grouped_pcm_sums as (
    select pcm_id -- ss_pcm_id 
     ,sum(amount) amount 
    from PCS 
    where COST_TYPE in ('DBCOST','DBCOST_TAX') 
    and SUPPLEMENT_TYPE = 'SS' 
    --and pcm_id = 2238 
    group by pcm_id 
), grouped_sell_values as (
    select pcp.pcp_id,sum(ppc.pax_tw) half_tw_sell 
    from ppp 
    join ppc on ppp.ppp_id = ppc.ppp_id 
    join pcp on ppp.pcp_id = pcp.pcp_id 
    where ppc.cost_type in ('AGENT','DBSELL_TAX','PCMUP_TAX','PCCOM_TAX') 
    group by pcp.pcp_id 
), grouped_cost_values as (
    select pcp.pcp_id,sum(ppc.pax_tw) half_tw_cost 
    from ppp 
    join ppc on ppp.ppp_id = ppc.ppp_id 
    join pcp on ppp.pcp_id = pcp.pcp_id 
    where ppc.cost_type in ('DBCOST','DBCOST_TAX') 
    group by pcp.pcp_id 
) 
select pcm.pcm_id 
     --,ss.ss_pcm_id 
     ,pcm.name 
     ,round(cost.half_tw_cost,2) half_tw_cost 
     ,round(sell.half_tw_sell,2) half_tw_sell 
     ,round(ss.amount,2) ss_cost 
     ,pcp.seq 
     ,pcp.pxno 
    from pcm pcm 
    -- for only SS 2238 sums, swap left join with the following cross apply 
    -- cross apply grouped_pcm_sums ss 
    left join grouped_pcm_sums ss on pcm.pcm_id = ss.pcm_id 
    left join pcp on pcm.pcm_id = pcp.pcm_id 
    left join grouped_sell_values sell on pcp.pcp_id = sell.pcp_id 
    left join grouped_cost_values cost on pcp.pcp_id = cost.pcp_id 
+0

cocogorilla - хочу, чтобы я мог купить вам выпить, спасибо вам, так много, это дает мне результат, который мне нужен, и вы правы, это не просто 1 PCM_ID, который мне нужен. Это Sat здесь, так что вы будете хорошо смотреть на то, что вы сделали, с четкой головой в Mon, но спасибо – Ozbear

+0

@Ozbear upvotes и ответы так же хороши, как напитки :) – cocogorilla

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