具有多个非空值的 MSSQL COALESCE 函数
MSSQL COALESCE function with multiple non null values
我正在尝试使用可变时间间隔和目的地选择从两个 table 获取数据(T_Stamp、目的地、重量、线路)。这将进入 Ignition SCADA。我下面的 SQL 代码适用于大多数情况,除非在两个 table 中都有条目具有相同的时间戳。在那些情况下,它只显示来自 table A 的数据。这给我的结果目的地不正确。我知道 COALESCE 函数正在返回第一个非空值,但我不知道如何编写此逻辑。
SELECT COALESCE(a.t_stamp, b.t_Stamp) T_Stamp, COALESCE(a.Destination, b.Destination) Destination, COALESCE(a.A_Weight, b.B_Weight) Weight, CASE WHEN a.Ham_Line_A_Counts_ndx > 0 THEN 'A' ELSE 'B' END AS Line
FROM Ham_Line_A_Counts as a FULL OUTER JOIN
b_Counts AS b
ON a.t_Stamp=b.t_Stamp
WHERE (a.t_Stamp Between '{Root Container.Popup Calendar.date}' AND '{Root Container.Popup Calendar 1.date}' AND a.Destination = {Root Container.Dropdown 1.selectedValue}) OR (b.t_Stamp Between '{Root Container.Popup Calendar.date}' AND '{Root Container.Popup Calendar 1.date}' AND b.Destination = {Root Container.Dropdown 1.selectedValue})
ORDER BY T_Stamp DESC
预期结果:
t_stamp
Destination
Weight
Line
10:05:01
1
30.01
A
10:05:05
1
25.11
B
10:05:07
1
26.32
B
实际结果:
t_stamp
Destination
Weight
Line
10:05:01
1
30.01
A
10:05:05
1
25.11
B
10:05:07
2
25.46
A
示例数据
Table答:
| t_stamp |目的地 | A_Weight |
| ------ | ---------- | ------ |
| 10:05:01 | 1 | 30.01 |
| 10:05:07 | 2 | 32.32 |
Table乙:
| t_stamp |目的地 | B_Weight |
| ------ | ---------- | ------ |
| 10:05:03 | 1 | 24.01 |
| 10:05:07 | 1 | 26.46 |
我怀疑您想要的是类似下面的东西,它使用 UNION
而不是 JOIN
。
SELECT a.t_stamp T_Stamp, a.Destination Destination, a.A_Weight Weight, 'A' Line
FROM Ham_Line_A_Counts a
WHERE a.t_Stamp Between '{Root Container.Popup Calendar.date}' AND '{Root Container.Popup Calendar 1.date}' AND a.Destination = {Root Container.Dropdown 1.selectedValue}
UNION ALL
SELECT b.t_stamp T_Stamp, b.Destination Destination, b.B_Weight Weight, 'B' Line
FROM b_Counts b
WHERE b.t_Stamp Between '{Root Container.Popup Calendar.date}' AND '{Root Container.Popup Calendar 1.date}' AND b.Destination = {Root Container.Dropdown 1.selectedValue})
ORDER BY T_Stamp DESC
这会从 a
获取具有正确目的地和时间戳的结果,从 b
获取具有正确目的地和时间戳的结果,然后按时间戳对它们进行排序。因此,如果时间戳位于 a
和 b
中,则两行都会依次返回。我使用 UNION ALL
而不仅仅是 UNION
,因为 Line
列中的硬编码 'A'/'B' 意味着不会有重复项并且 UNION ALL
可能会更有效率。
我正在尝试使用可变时间间隔和目的地选择从两个 table 获取数据(T_Stamp、目的地、重量、线路)。这将进入 Ignition SCADA。我下面的 SQL 代码适用于大多数情况,除非在两个 table 中都有条目具有相同的时间戳。在那些情况下,它只显示来自 table A 的数据。这给我的结果目的地不正确。我知道 COALESCE 函数正在返回第一个非空值,但我不知道如何编写此逻辑。
SELECT COALESCE(a.t_stamp, b.t_Stamp) T_Stamp, COALESCE(a.Destination, b.Destination) Destination, COALESCE(a.A_Weight, b.B_Weight) Weight, CASE WHEN a.Ham_Line_A_Counts_ndx > 0 THEN 'A' ELSE 'B' END AS Line
FROM Ham_Line_A_Counts as a FULL OUTER JOIN
b_Counts AS b
ON a.t_Stamp=b.t_Stamp
WHERE (a.t_Stamp Between '{Root Container.Popup Calendar.date}' AND '{Root Container.Popup Calendar 1.date}' AND a.Destination = {Root Container.Dropdown 1.selectedValue}) OR (b.t_Stamp Between '{Root Container.Popup Calendar.date}' AND '{Root Container.Popup Calendar 1.date}' AND b.Destination = {Root Container.Dropdown 1.selectedValue})
ORDER BY T_Stamp DESC
预期结果:
t_stamp | Destination | Weight | Line |
---|---|---|---|
10:05:01 | 1 | 30.01 | A |
10:05:05 | 1 | 25.11 | B |
10:05:07 | 1 | 26.32 | B |
实际结果:
t_stamp | Destination | Weight | Line |
---|---|---|---|
10:05:01 | 1 | 30.01 | A |
10:05:05 | 1 | 25.11 | B |
10:05:07 | 2 | 25.46 | A |
示例数据 Table答: | t_stamp |目的地 | A_Weight | | ------ | ---------- | ------ | | 10:05:01 | 1 | 30.01 | | 10:05:07 | 2 | 32.32 |
Table乙: | t_stamp |目的地 | B_Weight | | ------ | ---------- | ------ | | 10:05:03 | 1 | 24.01 | | 10:05:07 | 1 | 26.46 |
我怀疑您想要的是类似下面的东西,它使用 UNION
而不是 JOIN
。
SELECT a.t_stamp T_Stamp, a.Destination Destination, a.A_Weight Weight, 'A' Line
FROM Ham_Line_A_Counts a
WHERE a.t_Stamp Between '{Root Container.Popup Calendar.date}' AND '{Root Container.Popup Calendar 1.date}' AND a.Destination = {Root Container.Dropdown 1.selectedValue}
UNION ALL
SELECT b.t_stamp T_Stamp, b.Destination Destination, b.B_Weight Weight, 'B' Line
FROM b_Counts b
WHERE b.t_Stamp Between '{Root Container.Popup Calendar.date}' AND '{Root Container.Popup Calendar 1.date}' AND b.Destination = {Root Container.Dropdown 1.selectedValue})
ORDER BY T_Stamp DESC
这会从 a
获取具有正确目的地和时间戳的结果,从 b
获取具有正确目的地和时间戳的结果,然后按时间戳对它们进行排序。因此,如果时间戳位于 a
和 b
中,则两行都会依次返回。我使用 UNION ALL
而不仅仅是 UNION
,因为 Line
列中的硬编码 'A'/'B' 意味着不会有重复项并且 UNION ALL
可能会更有效率。