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表达式,而不是语句。