SQL 根据条件查询分区
SQL query over partition with condition
我有一个像这样的 table,在 SQL Server 2019 中:
ITEM_ID
Parent_Item
Talle
Existencia
909296
280647
4
1
909296
280647
4
1
909296
280647
4
1
909297
280647
5
1
909297
280647
5
1
909297
280647
5
1
909297
280647
5
1
909298
280647
6
1
909298
280647
6
1
909298
280647
6
1
909299
280647
7
1
909299
280647
7
1
909300
280647
8
1
909301
280647
9
1
909293
280647
11
1
909294
280647
12
1
909292
280647
10
1
1226447
280647
13
0
我需要一个名为 'Real Exist.' 的新列,其中包含 'Talle' 列中不同值的总和,当 'Existencia' = 1 时。在此示例中(Parent_item = 280647) 结果应为 9 ,因为 'Talle' 列中的值为 4,5,6,7,8,9,11, 12, 10 :
ITEM_ID
Parent_Item
Talle
Existencia
Real Exist.
909296
280647
4
1
9
909296
280647
4
1
9
909296
280647
4
1
9
909297
280647
5
1
9
909297
280647
5
1
9
909297
280647
5
1
9
909297
280647
5
1
9
909298
280647
6
1
9
909298
280647
6
1
9
909298
280647
6
1
9
909299
280647
7
1
9
909299
280647
7
1
9
909300
280647
8
1
9
909301
280647
9
1
9
909293
280647
11
1
9
909294
280647
12
1
9
909292
280647
10
1
9
1226447
280647
13
0
9
怎么做到的。提前致谢!
一种方法是使用派生查询来计算每个 Parent_Item
的唯一值的数量
SELECT yt.Item_Id
, yt.Parent_Item
, yt.Talle
, yt.Existencia
, cnt.NumOfTalle AS [Real Exist]
FROM YourTable yt
INNER JOIN (
SELECT Parent_Item, COUNT(DISTINCT Talle) AS NumOfTalle
FROM YourTable
WHERE Existencia = 1
GROUP BY Parent_Item
)
cnt ON cnt.Parent_Item = yt.Parent_Item
结果:
Item_Id | Parent_Item | Talle | Existencia | Real Exist
------: | ----------: | ----: | ---------: | ---------:
909296 | 280647 | 4 | 1 | 9
909296 | 280647 | 4 | 1 | 9
909296 | 280647 | 4 | 1 | 9
909297 | 280647 | 5 | 1 | 9
909297 | 280647 | 5 | 1 | 9
909297 | 280647 | 5 | 1 | 9
909297 | 280647 | 5 | 1 | 9
909298 | 280647 | 6 | 1 | 9
909298 | 280647 | 6 | 1 | 9
909298 | 280647 | 6 | 1 | 9
909299 | 280647 | 7 | 1 | 9
909299 | 280647 | 7 | 1 | 9
909300 | 280647 | 8 | 1 | 9
909301 | 280647 | 9 | 1 | 9
909293 | 280647 | 11 | 1 | 9
909294 | 280647 | 12 | 1 | 9
909292 | 280647 | 10 | 1 | 9
1226447 | 280647 | 13 | 0 | 9
db<>fiddle here
我有一个像这样的 table,在 SQL Server 2019 中:
ITEM_ID | Parent_Item | Talle | Existencia |
---|---|---|---|
909296 | 280647 | 4 | 1 |
909296 | 280647 | 4 | 1 |
909296 | 280647 | 4 | 1 |
909297 | 280647 | 5 | 1 |
909297 | 280647 | 5 | 1 |
909297 | 280647 | 5 | 1 |
909297 | 280647 | 5 | 1 |
909298 | 280647 | 6 | 1 |
909298 | 280647 | 6 | 1 |
909298 | 280647 | 6 | 1 |
909299 | 280647 | 7 | 1 |
909299 | 280647 | 7 | 1 |
909300 | 280647 | 8 | 1 |
909301 | 280647 | 9 | 1 |
909293 | 280647 | 11 | 1 |
909294 | 280647 | 12 | 1 |
909292 | 280647 | 10 | 1 |
1226447 | 280647 | 13 | 0 |
我需要一个名为 'Real Exist.' 的新列,其中包含 'Talle' 列中不同值的总和,当 'Existencia' = 1 时。在此示例中(Parent_item = 280647) 结果应为 9 ,因为 'Talle' 列中的值为 4,5,6,7,8,9,11, 12, 10 :
ITEM_ID | Parent_Item | Talle | Existencia | Real Exist. |
---|---|---|---|---|
909296 | 280647 | 4 | 1 | 9 |
909296 | 280647 | 4 | 1 | 9 |
909296 | 280647 | 4 | 1 | 9 |
909297 | 280647 | 5 | 1 | 9 |
909297 | 280647 | 5 | 1 | 9 |
909297 | 280647 | 5 | 1 | 9 |
909297 | 280647 | 5 | 1 | 9 |
909298 | 280647 | 6 | 1 | 9 |
909298 | 280647 | 6 | 1 | 9 |
909298 | 280647 | 6 | 1 | 9 |
909299 | 280647 | 7 | 1 | 9 |
909299 | 280647 | 7 | 1 | 9 |
909300 | 280647 | 8 | 1 | 9 |
909301 | 280647 | 9 | 1 | 9 |
909293 | 280647 | 11 | 1 | 9 |
909294 | 280647 | 12 | 1 | 9 |
909292 | 280647 | 10 | 1 | 9 |
1226447 | 280647 | 13 | 0 | 9 |
怎么做到的。提前致谢!
一种方法是使用派生查询来计算每个 Parent_Item
的唯一值的数量SELECT yt.Item_Id
, yt.Parent_Item
, yt.Talle
, yt.Existencia
, cnt.NumOfTalle AS [Real Exist]
FROM YourTable yt
INNER JOIN (
SELECT Parent_Item, COUNT(DISTINCT Talle) AS NumOfTalle
FROM YourTable
WHERE Existencia = 1
GROUP BY Parent_Item
)
cnt ON cnt.Parent_Item = yt.Parent_Item
结果:
Item_Id | Parent_Item | Talle | Existencia | Real Exist ------: | ----------: | ----: | ---------: | ---------: 909296 | 280647 | 4 | 1 | 9 909296 | 280647 | 4 | 1 | 9 909296 | 280647 | 4 | 1 | 9 909297 | 280647 | 5 | 1 | 9 909297 | 280647 | 5 | 1 | 9 909297 | 280647 | 5 | 1 | 9 909297 | 280647 | 5 | 1 | 9 909298 | 280647 | 6 | 1 | 9 909298 | 280647 | 6 | 1 | 9 909298 | 280647 | 6 | 1 | 9 909299 | 280647 | 7 | 1 | 9 909299 | 280647 | 7 | 1 | 9 909300 | 280647 | 8 | 1 | 9 909301 | 280647 | 9 | 1 | 9 909293 | 280647 | 11 | 1 | 9 909294 | 280647 | 12 | 1 | 9 909292 | 280647 | 10 | 1 | 9 1226447 | 280647 | 13 | 0 | 9
db<>fiddle here