2

看过并可能问错了方式,但找不到与我想要的相关的问题。

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

需要能够通过其中一种 ID 的 Supplement 类型添加两种成本类型的金额字段。

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 Supplement 添加 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 的价值的帮助都将不胜感激。

4

3 回答 3

1

让我解释一下我的解决方案。

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

如果您只想要 2238的总和,我不确定您的帖子,但如果这里的想法是不管您报告的 PCM_ID 是什么,总是报告 2238 的 SS 总和......那么您可以取消注释评论的行并进行交易带有叉号的连接适用于将值与报告的其余部分相提并论。

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
于 2013-08-16T16:59:23.927 回答
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)

我希望这有帮助 :)

编辑(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

如果这不适合您,您使用的是哪个数据库(包括版本)?

于 2013-07-31T07:56:52.233 回答
0

根本不存储税额?看起来是成本的 10%,所以你为什么不在拉报告的时候计算一下呢?

于 2013-07-31T08:08:57.963 回答