2013-07-31 50 views
2

已经看过,也许问了错误的方法,但找不到相关的问题。基于3个字段的记录的某个记录的总和

我有一个表有4个字段,一个ID是另一个记录,然后是成本类型,补充类型和金额。

需要能够为其中一个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 

所以去SS补充添加DBCOST和DBCOST_TAX。

我只是不知道如何进入查询给我的每个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') 

这是一个较大的查询的一部分,但只有这个部分的麻烦。

希望在这里有足够的信息可以帮助我。

添加到这个8月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,这给我的结果,我正在寻找的时候运行,但是当我把它添加到整个查询我得到以下错误:消息116,级别16,状态1,行19 只能指定一个表达式在子查询未与EXISTS一起引入的选择列表中。 我试图实现的是一个查询,它可以在Excel表格中作为自定义报告运行,软件公司作为从数据库获取信息然后可以在数据透视表中组织的连接器。完整的查询是我想要放在一起的,我认为它超出了我的SQL技能集。谢谢你的帮助。 – Ozbear

+0

正如我已经说过的,我也不是SQL专家,也没有看到整个声明,我没有更多的东西可以添加... – munyul

+0

如果任何人都可以提供帮助,我将添加到上面的原始更多细节。 – Ozbear

0

根本不存储税额?它看起来好像是成本的10%,那么为什么当你提交报告时你不计算呢?

1

让我解释我的解决方案。

grouped_pcm_sums这可能是一个视图。 SQL 2008支持我在这里使用的CTE。我喜欢分开解决问题,而不是在单个查询中解决问题。这里只需获取您正在查找的确切数据的总和,并在您的报告查询中具有正确的ID以供参考。

如果只希望资金用于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 - 希望我可以给你买一杯饮料,谢谢soooooo这是给我我需要的结果,你是对的,它不仅仅是我需要的1个PCM_ID。这是周六在这里,所以将有一个很好的看看你已经做了什么,在星期一清晰的头,但谢谢你 – Ozbear

+0

@Ozbear upvotes upvotes和答案一样好喝:) – cocogorilla

相关问题