【发布时间】:2021-08-20 08:51:44
【问题描述】:
我有这个问题:
SELECT DISTINCT
MAX(D.RECEIVEDDATE) AS DATE,
A.LOCATIONNUMBER AS ID_NAME,
(SELECT CARRIERNUMBER FROM CARRIER C WHERE C.CARRIERID = D.CARRIERID) AS CR_NAME,
D.DEPOSITREFERENCE As ITEM_REF,
DC.CONTAINERNUMBER As ITEM_NUM,
Z.DENOMINATION As Category,
D.RECEIVEDCONTAINERS as ITEM_QTY,
SUM(CASE WHEN Z.DENOMINATION LIKE '%50%' THEN CAST(Z.VERIFIEDQUANTITY AS BIGINT) END) QTY_50_PCS,
SUM(CASE WHEN Z.DENOMINATION LIKE '%100%' THEN CAST(Z.VERIFIEDQUANTITY AS BIGINT) END) QTY_100_PCS,
SUM(CASE WHEN Z.DENOMINATION LIKE '%50%' THEN CAST(Z.VERIFIEDAMOUNT AS BIGINT) END) AMT_50_PCS,
SUM(CASE WHEN Z.DENOMINATION LIKE '%100%' THEN CAST(Z.VERIFIEDAMOUNT AS BIGINT) END) AMT_100_PCS,
CAST(D.VERIFIEDAMOUNT AS BIGINT) AS TOTAL_AMT
FROM
DEPOSIT D
JOIN
ACCOUNT A ON D.ACCOUNTID = A.ACCOUNTID
LEFT JOIN
DEPOSITCONTAINER DC ON DC.DEPOSITID = D.DEPOSITID
LEFT JOIN
DEPOSITCONTAINERITEM Z ON Z.DEPOSITCONTAINERID = DC.DEPOSITCONTAINERID
LEFT JOIN
DEPOSITCONTAINERITEMUNIT X ON X.DEPOSITCONTAINERITEMID = Z.DEPOSITCONTAINERITEMID
WHERE
D.DEPOSITTYPE = 0
AND LOCATIONNUMBER LIKE 'Z%'
AND D.RECEIVEDDATE IS NOT NULL
AND Z.DENOMINATION IS NOT NULL
GROUP BY
D.RECEIVEDDATE, A.LOCATIONNUMBER, D.CARRIERID, D.DEPOSITREFERENCE,
D.RECEIVEDCONTAINERS, D.VERIFIEDAMOUNT, DC.CONTAINERNUMBER, DC.VERIFIEDAMOUNT, Z.DENOMINATION
ORDER BY
D.DEPOSITREFERENCE
输出/结果会变成这样:
| DATE | ID_NAME | CR_NAME | ITEM_REF | ITEM_NUM | CATEGORY | ITEM_QTY | QTY_50_PCS | QTY_100_PCS | AMT_50_PCS | AMT_100_PCS | TOTAL_AMT |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 2021-07-26 | XXN8A | ABC | 0039546898202ZZN8A | N5-050-210001 | 50000 | 6 | 2000 | NULL | 100000000 | NULL | 672600000 |
| 2021-07-26 | XXN8A | ABC | 0039546898202ZZN8A | N5-050-210002 | 50000 | 6 | 2095 | NULL | 104750000 | NULL | 672600000 |
| 2021-07-26 | XXN8A | ABC | 0039546898202ZZN8A | N5-100-2100002 | 100000 | 6 | NULL | 2120 | NULL | 212000000 | 672600000 |
| 2021-07-26 | XXN8A | ABC | 0039546898202ZZN8A | N5-100-210001 | 100000 | 6 | NULL | 2069 | NULL | 206900000 | 672600000 |
| 2021-07-26 | XXN8A | ABC | 0039546898202ZZN8A | N5-RJC-210001 | 100000 | 6 | NULL | 383 | NULL | 38300000 | 672600000 |
| 2021-07-26 | XXN8A | ABC | 0039546898202ZZN8A | N5-RJC-210001 | 50000 | 6 | 213 | NULL | 10650000 | NULL | 672600000 |
| 2021-07-27 | CCY57 | CAB | 0344416011204ZZY57 | G6-50-210153 | 50000 | 6 | 68 | NULL | 3400000 | NULL | 140050000 |
| 2021-07-27 | CCY57 | CAB | 0344416011204ZZY57 | G6-50-210154 | 50000 | 6 | 75 | NULL | 3750000 | NULL | 140050000 |
| 2021-07-27 | CCY57 | CAB | 0344416011204ZZY57 | G6-RJC-210153 | 100000 | 6 | NULL | 486 | NULL | 48600000 | 140050000 |
| 2021-07-27 | CCY57 | CAB | 0344416011204ZZY57 | G6-RJC-210153 | 50000 | 6 | 26 | NULL | 1300000 | NULL | 140050000 |
如何根据ITEM_NUM获取只有一行和列的转置表?例如,第一项 N5-050-210001 价值数量 2000 将在 QTY_50 列中,那么如果有第二项 N5-050-210002 的值为 2095,它将被放置在第二列 QTY_50_2 中。这也适用于像'%-100-%'和'%-RJC%'这样的ITEM_NUM,ITEM_NUM和Category列将被消除,我想要的结果是这样的:
| DATE | ID_NAME | CR_NAME | ITEM_REF | ITEM_QTY | QTY_50 | QTY_50_2 | QTC_RJC_50 | QTY_100 | QTY_100_2 | QTC_RJC_100 | AMT_50_PCS | AMT_100_PCS | TOTAL_AMT |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 7/26/2021 | XXN8A | ABC | 0039546898202ZZN8A | 6 | 2000 | 2095 | 213 | 2069 | 2120 | 383 | 215400000 | 457200000 | 672600000 |
| 7/27/2021 | CCY57 | CAB | 0344416011204ZZY57 | 6 | 68 | 75 | 26 | 773 | 57 | 486 | 8450000 | 131600000 | 140050000 |
有什么建议吗?
【问题讨论】:
-
请只标记您真正使用的RDBMS。谢谢。
-
SELECT DISTINCT在您执行GROUP BY时(很少)不需要,因为GROUP BY不会返回重复的行。 -
旁注:使用
DISTINCT和GROUP BY几乎总是存在缺陷的迹象;GROUP BY已经强制您的数据在 distinct 组中返回。这通常意味着您的GROUP BY是错误的(我可能会建议这是错误的,因为您的GROUP BY中的列比SELECT中的未聚合列多)。也许如果你修复你的GROUP BY(并删除DISTINCT,因为它只是不必要的开销)问题就会消失? -
轻松为您提供帮助 - 简化! minimal reproducible example
-
LEFT JOIN Z结合where z.column is not null,意味着你实际上想要一个普通的INNER JOIN。
标签: sql pivot-table transpose