Sql 如何根据列的值获取和排序一些列?
我正在尝试从另一个表创建一个表。 问题是比较3个不同的列,其中一个不同的列为nullSql 如何根据列的值获取和排序一些列?,sql,sql-insert,Sql,Sql Insert,我正在尝试从另一个表创建一个表。 问题是比较3个不同的列,其中一个不同的列为null 将“比较ItemID1、ItemID2和ItemID3,只取其中有值的项,并使其成为一行” 没有永远是最大的。如果该列包含“是”和“否”,则将选择“否” 注意。一个CustomerID可以有多个不同的ItemID 例1 +------------+---------+---------+---------+------------+ | CustomerID | ItemID1 | ItemID2 | It
- 将“比较ItemID1、ItemID2和ItemID3,只取其中有值的项,并使其成为一行”
- 没有永远是最大的。如果该列包含“是”和“否”,则将选择“否”
- 注意。一个CustomerID可以有多个不同的ItemID
+------------+---------+---------+---------+------------+
| CustomerID | ItemID1 | ItemID2 | ItemID3 | Value |
+------------+---------+---------+---------+------------+
| 1 | abc | xyz | cde | Yes |
| 1 | abc | null | cde | No |
| 1 | null | xyz | cde | No |
| 1 | abc | xyz | cde | No |
| 1 | iop | tyu | ghj | Yes |
| 1 | iop | null | ghj | Yes |
| 1 | iop | tyu | ghj | Yes |
| 1 | null | tyu | ghj | Yes |
+------------+---------+---------+---------+------------+
预期结果将是
+------------+---------+---------+---------+-------+
| CustomerID | ItemID1 | ItemID2 | ItemID3 | Value |
+------------+---------+---------+---------+-------+
| 1 | abc | xyz | cde | No |
| 1 | iop | tyu | ghj | Yes |
+------------+---------+---------+---------+-------+
+------------+---------+---------+---------+-------+
| CustomerID | ItemID1 | ItemID2 | ItemID3 | Value |
+------------+---------+---------+---------+-------+
| 1 | fgh | xyz | zxc | No |
| 1 | iop | tyu | ghj | Yes |
| 2 | abc | xyz | cde | No |
+------------+---------+---------+---------+-------+
例2
+------------+---------+---------+---------+------------+
| CustomerID | ItemID1 | ItemID2 | ItemID3 | Value |
+------------+---------+---------+---------+------------+
| 1 | qwe | null | asd | No |
| 1 | qwe | null | asd | Yes |
| 1 | null | null | asd | Yes |
| 1 | qwe | null | asd | Yes |
+------------+---------+---------+---------+------------+
预期结果将是
+------------+---------+---------+---------+-------+
| CustomerID | ItemID1 | ItemID2 | ItemID3 | Value |
+------------+---------+---------+---------+-------+
| 1 | qwe | null | asd | No |
+------------+---------+---------+---------+-------+
+------------+---------+---------+---------+-------+
| CustomerID | ItemID1 | ItemID2 | ItemID3 | Value |
+------------+---------+---------+---------+-------+
| 1 | fgh | xyv | zxc | Yes |
+------------+---------+---------+---------+-------+
例3
+------------+---------+---------+---------+------------+
| CustomerID | ItemID1 | ItemID2 | ItemID3 | Value |
+------------+---------+---------+---------+------------+
| 1 | fgh | null | zxc | Yes |
| 1 | fgh | xyv | zxc | Yes |
| 1 | null | null | zxc | Yes |
| 1 | fgh | null | zxc | Yes |
+------------+---------+---------+---------+------------+
预期结果将是
+------------+---------+---------+---------+-------+
| CustomerID | ItemID1 | ItemID2 | ItemID3 | Value |
+------------+---------+---------+---------+-------+
| 1 | qwe | null | asd | No |
+------------+---------+---------+---------+-------+
+------------+---------+---------+---------+-------+
| CustomerID | ItemID1 | ItemID2 | ItemID3 | Value |
+------------+---------+---------+---------+-------+
| 1 | fgh | xyv | zxc | Yes |
+------------+---------+---------+---------+-------+
我已经试过了。
我已经试过了,代码如下。但是收到了错误的结果。
看起来它只是基于ItemID1取第一个
范例
+------------+---------+---------+---------+------------+
| CustomerID | ItemID1 | ItemID2 | ItemID3 | Value |
+------------+---------+---------+---------+------------+
| 1 | fgh | null | zxc | Yes |
| 1 | fgh | xyv | zxc | No |
| 1 | null | null | zxc | Yes |
| 1 | fgh | null | zxc | Yes |
| 1 | iop | tyu | ghj | Yes |
| 1 | iop | null | ghj | Yes |
| 1 | iop | tyu | ghj | Yes |
| 1 | null | tyu | ghj | Yes |
| 2 | abc | xyz | cde | Yes |
| 2 | abc | null | cde | No |
| 2 | null | xyz | cde | No |
| 2 | abc | xyz | cde | No |
+------------+---------+---------+---------+------------+
结果返回
+------------+---------+---------+---------+-------+
| CustomerID | ItemID1 | ItemID2 | ItemID3 | Value |
+------------+---------+---------+---------+-------+
| 1 | fgh | null | zxc | Yes |
| 1 | iop | tyu | ghj | Yes |
| 2 | abc | xyz | cde | Yes |
+------------+---------+---------+---------+-------+
预期结果将是
+------------+---------+---------+---------+-------+
| CustomerID | ItemID1 | ItemID2 | ItemID3 | Value |
+------------+---------+---------+---------+-------+
| 1 | abc | xyz | cde | No |
| 1 | iop | tyu | ghj | Yes |
+------------+---------+---------+---------+-------+
+------------+---------+---------+---------+-------+
| CustomerID | ItemID1 | ItemID2 | ItemID3 | Value |
+------------+---------+---------+---------+-------+
| 1 | fgh | xyz | zxc | No |
| 1 | iop | tyu | ghj | Yes |
| 2 | abc | xyz | cde | No |
+------------+---------+---------+---------+-------+
我试过的代码
INSERT INTO NEW_TABLE
(CustomerID,
ItemID1,
ItemID2,
ItemID3,
Value)
SELECT
CustomerID,
ItemID1,
ItemID2,
ItemID3,
Value
FROM (SELECT
CustomerID,
ItemID1,
ItemID2,
ItemID3,
Value,
row_number() OVER(PARTITION BY ItemID1 ORDER BY ETA DESC)rn
FROM ETA_TABLE)
WHERE rn = 1
我想你想要:
SELECT
CustomerID,
MAX(ItemID1) AS ItemID1,
MAX(ItemID2) AS ItemID2,
MAX(ItemID3) AS ItemID3,
CASE WHEN SUM(CASE WHEN Value = 'No' THEN 1 END) > 0 THEN 'No' ELSE 'Yes' END AS Value
FROM ETA_TABLE
GROUP BY
CustomerID;
select t.*,
(select min(value)
from t t2
where t2.CustomerID = t.CustomerID and
(t2.ItemID1 = t.ItemID1 or
t2.ItemID2 = t.ItemID2 or
t2.ItemID3 = t.ItemID3
)
) as valu
from (select distinct CustomerID, ItemID1, ItemID2, ItemID3
from t
where ItemID1 is not null and
ItemID2 is not null and
ItemID3 is not null
) t;
我想你想要:
SELECT
CustomerID,
MAX(ItemID1) AS ItemID1,
MAX(ItemID2) AS ItemID2,
MAX(ItemID3) AS ItemID3,
CASE WHEN SUM(CASE WHEN Value = 'No' THEN 1 END) > 0 THEN 'No' ELSE 'Yes' END AS Value
FROM ETA_TABLE
GROUP BY
CustomerID;
select t.*,
(select min(value)
from t t2
where t2.CustomerID = t.CustomerID and
(t2.ItemID1 = t.ItemID1 or
t2.ItemID2 = t.ItemID2 or
t2.ItemID3 = t.ItemID3
)
) as valu
from (select distinct CustomerID, ItemID1, ItemID2, ItemID3
from t
where ItemID1 is not null and
ItemID2 is not null and
ItemID3 is not null
) t;
MIN()
注意:您的示例数据具有不相交的项集——没有重叠。如果您的实际数据中存在这种情况,而这并不能解决您的问题,您应该再问一个问题。Hi@Tim谢谢您的回答,我不明白这一行是如何工作的。当计数(值)计数(*)时,则最大值结束为值。空值是最大值吗?在我解决任何问题之前,你能解释一下为什么在所有情况下,value
列中都会出现Null
输出吗?哦,对不起,我犯了一个错误。它不需要为null。“值”列假定为“是”或“否”。否比“是”大,因此,如果记录由“是”和“否”组成,则最终结果应仅显示“否”。如果记录只包含yes,那么最终结果应该显示yes only不知道你现在在说什么。您的样本数据中没有一个包含是或否。嗨@Tim,我已经编辑了这些问题。为了更好地理解,我也更改了数据。现在,该值为“是”或“否”。对于错误,请解释预期输出背后的逻辑。对于项目具有多个非NULL
值的客户,填写NULL
值的规则是什么?@IvanSim。我删除了不兼容的数据库标记。请仅使用您真正使用的数据库进行标记。