Sql 同一列上的多个子查询

Sql 同一列上的多个子查询,sql,sql-server,Sql,Sql Server,我试图使用不同的标准从一个表中提取多个不同的总和。唯一的问题是,我的子查询回调了多个响应,所以我稍微更改了一下查询,然后在试图找到最好的方法时迷失了方向 以下是我目前正在处理的问题: SELECT TER_ID AS TER_ID, SUM(MED_AMT) AS NET_SLS_AMT, SUM(SELECT MED_AMT FROM DAY_TER_MEDIA WHERE TND_CD = 1 AND DAY_TER_MEDIA.D

我试图使用不同的标准从一个表中提取多个不同的总和。唯一的问题是,我的子查询回调了多个响应,所以我稍微更改了一下查询,然后在试图找到最好的方法时迷失了方向

以下是我目前正在处理的问题:

   SELECT TER_ID AS TER_ID,
   SUM(MED_AMT) AS NET_SLS_AMT,
   SUM(SELECT MED_AMT
       FROM DAY_TER_MEDIA
       WHERE TND_CD = 1 AND
       DAY_TER_MEDIA.DT = '') AS CASH_AMT,
   SUM(SELECT MED_AMT
       FROM DAY_TER_MEDIA
       WHERE DAY_TER_MEDIA.TND_CD IN(4,5,16,18,23,31) AND
       DAY_TER_MEDIA.DT = '') AS ELEC_AMT,
   SUM(SELECT MED_AMT
       FROM DAY_TER_MEDIA
       WHERE DAY_TER_MEDIA.TND_CD IN(2,3,8,9,10,11,15,20,52) AND
       DAY_TER_MEDIA.DT = '') AS OTHER_AMT
   FROM DAY_TER_MEDIA
   WHERE DT = ''
   GROUP BY TER_ID;

如您所见,我的意图是从同一列中提取净金额、现金金额、电子金额和其他金额,并仅对具有特定TND、DT和TERU ID的金额求和。正如我所说,我已经多次更改此查询,并且我知道它的当前迭代实际上并不能满足我的需要。我有点不知所措,但仍然按照日期和主题对它们进行分组。有什么想法吗?或者甚至有一种干净的方法可以做到这一点吗?

使用用例语句而不是选择

SELECT TER_ID AS TER_ID,
        SUM(MED_AMT) AS NET_SLS_AMT,
        SUM(CASE WHEN TND_CD = 1 THEN MED_AMT
                 ELSE 0
            END) AS CASH_AMT,
        SUM(CASE WHEN DAY_TER_MEDIA.TND_CD IN (4,5,16,18,23,31) THEN MED_AMT
                 ELSE 0
            END) AS ELEC_AMT,
        SUM(CASE WHEN DAY_TER_MEDIA.TND_CD IN (2,3,8,9,10,11,15,20,52) THEN MED_AMT
                 ELSE 0
            END) AS OTHER_AMT
 FROM   DAY_TER_MEDIA
 WHERE  DT = ''
 GROUP BY TER_ID;

使用用例语句而不是选择

SELECT TER_ID AS TER_ID,
        SUM(MED_AMT) AS NET_SLS_AMT,
        SUM(CASE WHEN TND_CD = 1 THEN MED_AMT
                 ELSE 0
            END) AS CASH_AMT,
        SUM(CASE WHEN DAY_TER_MEDIA.TND_CD IN (4,5,16,18,23,31) THEN MED_AMT
                 ELSE 0
            END) AS ELEC_AMT,
        SUM(CASE WHEN DAY_TER_MEDIA.TND_CD IN (2,3,8,9,10,11,15,20,52) THEN MED_AMT
                 ELSE 0
            END) AS OTHER_AMT
 FROM   DAY_TER_MEDIA
 WHERE  DT = ''
 GROUP BY TER_ID;

无法获得预期结果的原因是,子查询与FROM中的表之间没有关系。您需要在每个子查询
WHERE
子句中添加该关系(称为关联子查询,因为它使用子查询中外部查询的值):

但这是一种非常低效的方法。相反,使用不带任何子查询的
CASE
语句:

SELECT 
    TER_ID,
    SUM(CASE WHEN TND_CD = 1 THEN MED_AMT ELSE 0 END) as CASH_AMT,
    SUM(CASE WHEN TND_CD IN(4,5,16,18,23,31) THEN MED_AMT ELSE 0 END) as ELEC_AMT,
    SUM(CASE WHEN TND_CD IN(2,3,8,9,10,11,15,20,52) THEN MED_AMT ELSE 0 END) AS OTHER_AMT
FROM DAY_TER_MEDIA
WHERE DT= ''
GROUP BY TER_ID

无法获得预期结果的原因是,子查询与FROM中的表之间没有关系。您需要在每个子查询
WHERE
子句中添加该关系(称为关联子查询,因为它使用子查询中外部查询的值):

但这是一种非常低效的方法。相反,使用不带任何子查询的
CASE
语句:

SELECT 
    TER_ID,
    SUM(CASE WHEN TND_CD = 1 THEN MED_AMT ELSE 0 END) as CASH_AMT,
    SUM(CASE WHEN TND_CD IN(4,5,16,18,23,31) THEN MED_AMT ELSE 0 END) as ELEC_AMT,
    SUM(CASE WHEN TND_CD IN(2,3,8,9,10,11,15,20,52) THEN MED_AMT ELSE 0 END) AS OTHER_AMT
FROM DAY_TER_MEDIA
WHERE DT= ''
GROUP BY TER_ID
一种方法是使用返回条件总计。我的示例使用以下示例数据:

样本数据

/* Using table variables makes sharing sample data easy.
 */
DECLARE @Example TABLE
    (
        [Type]  INT,
        AMT     MONEY
    )
;

INSERT INTO @Example
    (
        [Type],
        AMT
    )
VALUES
    (1, 10),
    (1, 15),
    (1, 45),
    (2, 30),
    (2, 20)
;
在本例中,每列根据类型有条件地包含AMT或0。该函数聚合结果

示例

/* Removing the SUM functions would highlight how this technique works.
 */
SELECT
    SUM(CASE WHEN [Type] = 1 THEN AMT ELSE 0 END) AS AMT_1,
    SUM(CASE WHEN [Type] = 2 THEN AMT ELSE 0 END) AS AMT_2
FROM
    @Example
;
一种方法是使用返回条件总计。我的示例使用以下示例数据:

样本数据

/* Using table variables makes sharing sample data easy.
 */
DECLARE @Example TABLE
    (
        [Type]  INT,
        AMT     MONEY
    )
;

INSERT INTO @Example
    (
        [Type],
        AMT
    )
VALUES
    (1, 10),
    (1, 15),
    (1, 45),
    (2, 30),
    (2, 20)
;
在本例中,每列根据类型有条件地包含AMT或0。该函数聚合结果

示例

/* Removing the SUM functions would highlight how this technique works.
 */
SELECT
    SUM(CASE WHEN [Type] = 1 THEN AMT ELSE 0 END) AS AMT_1,
    SUM(CASE WHEN [Type] = 2 THEN AMT ELSE 0 END) AS AMT_2
FROM
    @Example
;

啊,我不知道SUM可以用案例陈述。太神奇了!非常感谢你的帮助。这正是我想要的。Case表达式,而不是语句。它是一个“trilby”,而不是一个“fedora”。啊,我不知道Case语句可以用在SUM中。太神奇了!非常感谢你的帮助。这正是我想要的。Case表达式,而不是语句。它是一个“trilby”,而不是“fedora”。Case表达式,而不是语句。Case表达式,而不是语句。