在SQL Server中为每个条件值创建新行

时间:2019-03-27 15:36:48

标签: sql-server

我想为每个空值创建新行。例如:

数据Origen表:该表具有两个空值(阿迪达斯,耐克),我想在id_brand为空时为每个id_brand创建新值

公式 计数具有空值的id_brand * 不具有空值的id_brand

6个新行= 2个空值* 3个非空值

+-------------+-------------+----------+-------+
| id_category | description | id_brand | value |
+-------------+-------------+----------+-------+
|           5 | adidas      |          |   100 |
|           5 | nike        |          |    65 |
|           5 | samsung     |        1 |    40 |
|           5 | coca-cola   |        2 |    15 |
|           5 | puma        |        3 |    70 |
+-------------+-------------+----------+-------+

我期望的数据表,当前行和新的6行(每个ID_brand的值都不为空)

+-------------+-------------+----------+-------+
| id_category | description | id_brand | value |
+-------------+-------------+----------+-------+
|           5 | adidas      |          |   100 |
|           5 | nike        |          |    65 |
|           5 | samsung     |        1 |    40 |
|           5 | coca-cola   |        2 |    15 |
|           5 | puma        |        3 |    70 |
+-------------+-------------+----------+-------+
|           5 | adidas      |        1 |   100 |
|           5 | nike        |        1 |    65 |
|           5 | adidas      |        2 |   100 |
|           5 | nike        |        2 |    65 |
|           5 | adidas      |        3 |   100 |
|           5 | nike        |        3 |    65 |
+-------------+-------------+----------+-------+

如何在Sql中完成类似的事情?

1 个答案:

答案 0 :(得分:0)

只要仅用于报告,并且您完全确定这是必需的,则可以使用简单的CROSS JOIN完成。我正在以消耗性格式添加示例数据,这是在SQL中寻求帮助时发布该数据的最佳方法。

CREATE TABLE SampleData(
    id_category int,
    description varchar(100),
    id_brand    int,
    value       int
)
INSERT INTO SampleData
VALUES
    (5, 'adidas   ', NULL, 100),
    (5, 'nike     ', NULL,  65),
    (5, 'samsung  ', 1,  40),
    (5, 'coca-cola', 2,  15),
    (5, 'puma     ', 3,  70);

SELECT d.id_category, 
       d.description,
       b.id_brand,
       d.value
FROM SampleData d
CROSS JOIN SampleData b
WHERE b.id_brand IS NOT NULL
AND d.id_brand IS NULL
ORDER BY id_brand, description;