将SELECT按WHERE条件分隔成多列,不会因为加到GROUP BY造成多行
Separate SELECT into multiple columns by WHERE condition without creating multiple rows caused by adding to GROUP BY
当 trs_trust_code 为 1 或 2 时,我试图将 SUM( trs_amt ) 和 SELECT 拆分为 'trs_sum' 列,并拆分为 [= trs_trust_code = 9 时的 15=] 列。在将 trs_trust_code 添加到 GROUP BY 时,我似乎无法弄清楚如何在不创建额外行的情况下做到这一点。我在 SELECT 中尝试过一个 CASE,在 GROUP BY 中尝试过一个 CASE,子查询
SELECT
trs_desk,
dsk_name,
DATEPART( YEAR, DATEADD( DAY, trs_trx_date, '1600-12-31' ) ) as 'year',
DATEPART( MONTH, DATEADD( DAY, trs_trx_date, '1600-12-31' ) ) as 'month',
COUNT( DISTINCT trs_amt ) AS 'trs_count',
SUM( trs_amt ) AS 'trs_sum',
SUM( trs_comm_amt ) AS 'trs_comm_sum'
FROM cds.trs
JOIN cds.dsk on dsk_code = trs_desk
WHERE trs_desk IN ( 'ACE' )
AND trs_trust_code IN ('1','2','9')
GROUP BY trs_desk, year, month, dsk_name
ORDER BY trs_desk ASC, year DESC, month DESC
求和时请使用表达式case when trs_trust_code = 9 then trs_amt else 0 end。例如像这样:
SELECT
trs_desk,
dsk_name,
DATEPART( YEAR, DATEADD( DAY, trs_trx_date, '1600-12-31' ) ) as 'year',
DATEPART( MONTH, DATEADD( DAY, trs_trx_date, '1600-12-31' ) ) as 'month',
COUNT( DISTINCT trs_amt ) AS 'trs_count',
SUM( case when trs_trust_code = 1 or trs_trust_code = 2 then trs_amt else 0 end ) AS 'trs_sum',
SUM( case when trs_trust_code = 9 then trs_amt else 0 end ) AS 'interest',
SUM( trs_comm_amt ) AS 'trs_comm_sum'
FROM cds.trs
JOIN cds.dsk on dsk_code = trs_desk
WHERE trs_desk IN ( 'ACE' )
AND trs_trust_code IN ('1','2','9')
GROUP BY trs_desk, year, month, dsk_name
ORDER BY trs_desk ASC, year DESC, month DESC
当 trs_trust_code 为 1 或 2 时,我试图将 SUM( trs_amt ) 和 SELECT 拆分为 'trs_sum' 列,并拆分为 [= trs_trust_code = 9 时的 15=] 列。在将 trs_trust_code 添加到 GROUP BY 时,我似乎无法弄清楚如何在不创建额外行的情况下做到这一点。我在 SELECT 中尝试过一个 CASE,在 GROUP BY 中尝试过一个 CASE,子查询
SELECT
trs_desk,
dsk_name,
DATEPART( YEAR, DATEADD( DAY, trs_trx_date, '1600-12-31' ) ) as 'year',
DATEPART( MONTH, DATEADD( DAY, trs_trx_date, '1600-12-31' ) ) as 'month',
COUNT( DISTINCT trs_amt ) AS 'trs_count',
SUM( trs_amt ) AS 'trs_sum',
SUM( trs_comm_amt ) AS 'trs_comm_sum'
FROM cds.trs
JOIN cds.dsk on dsk_code = trs_desk
WHERE trs_desk IN ( 'ACE' )
AND trs_trust_code IN ('1','2','9')
GROUP BY trs_desk, year, month, dsk_name
ORDER BY trs_desk ASC, year DESC, month DESC
求和时请使用表达式case when trs_trust_code = 9 then trs_amt else 0 end。例如像这样:
SELECT
trs_desk,
dsk_name,
DATEPART( YEAR, DATEADD( DAY, trs_trx_date, '1600-12-31' ) ) as 'year',
DATEPART( MONTH, DATEADD( DAY, trs_trx_date, '1600-12-31' ) ) as 'month',
COUNT( DISTINCT trs_amt ) AS 'trs_count',
SUM( case when trs_trust_code = 1 or trs_trust_code = 2 then trs_amt else 0 end ) AS 'trs_sum',
SUM( case when trs_trust_code = 9 then trs_amt else 0 end ) AS 'interest',
SUM( trs_comm_amt ) AS 'trs_comm_sum'
FROM cds.trs
JOIN cds.dsk on dsk_code = trs_desk
WHERE trs_desk IN ( 'ACE' )
AND trs_trust_code IN ('1','2','9')
GROUP BY trs_desk, year, month, dsk_name
ORDER BY trs_desk ASC, year DESC, month DESC