我有一個 SQL 資料庫,其中包含一些由第三人每天添加的資料,每個人必須通過表單向我的一個表添加 10 行資料,但有時有人忘記添加其中一行,每行代表一個不同的結果,我想要做的是顯示在特定日期和班次中沒有插入的行,這是表格的一個例子
| 資料標識 | 用戶 | 日期 | 轉移 | 機器 |
|---|---|---|---|---|
| 3227 | 100 | 28/11/2021 | 1 | TG01 |
| 3228 | 103 | 28/11/2021 | 1 | TG02 |
| 3229 | 103 | 28/11/2021 | 1 | TG03 |
| 3230 | 100 | 28/11/2021 | 1 | TG04 |
| 3231 | 105 | 28/11/2021 | 1 | TG05 |
| 3232 | 100 | 28/11/2021 | 1 | TG06 |
| 3233 | 107 | 28/11/2021 | 1 | TG07 |
| 3234 | 100 | 28/11/2021 | 1 | TG08 |
| 3235 | 108 | 28/11/2021 | 1 | TG09 |
| 3236 | 100 | 28/11/2021 | 1 | TG010 |
| 3237 | 101 | 28/11/2021 | 2 | TG01 |
| 3238 | 101 | 28/11/2021 | 2 | TG04 |
| 3239 | 101 | 28/11/2021 | 2 | TG05 |
| 3240 | 109 | 28/11/2021 | 2 | TG06 |
| 3241 | 106 | 28/11/2021 | 2 | TG07 |
| 3242 | 101 | 28/11/2021 | 2 | TG08 |
每個班次我都必須有 TG01、TG02、TG03 ....TG10,我如何在像班次 2 這樣的情況下顯示缺少哪些?我想使用 sql 查詢在 powerbi 中顯示它,而不必每天手動檢查它
uj5u.com熱心網友回復:
我將為此做的是創建一個簡單的堆表,其中一列從 TG01 到 TG10,然后執行 LEFT JOIN 并檢查 NULL。
該表將如下所示:
CREATE TABLE HeapTableWithMachines
(
[machine] CHAR(4)
)
然后為機器做 10 次插入。
INSERT INTO HeapTableWithMachines VALUES ('TG01')
INSERT INTO HeapTableWithMachines VALUES ('TG02')
INSERT INTO HeapTableWithMachines VALUES ('TG03')
INSERT INTO HeapTableWithMachines VALUES ('TG04')
INSERT INTO HeapTableWithMachines VALUES ('TG05')
INSERT INTO HeapTableWithMachines VALUES ('TG06')
INSERT INTO HeapTableWithMachines VALUES ('TG07')
INSERT INTO HeapTableWithMachines VALUES ('TG08')
INSERT INTO HeapTableWithMachines VALUES ('TG09')
INSERT INTO HeapTableWithMachines VALUES ('TG10')
然后使用子選擇來檢查已經插入但缺少一些機器的輪班,方法是執行笛卡爾積,即 CROSS JOIN,然后檢查整個表。
SELECT
S.[user]
,S.[date]
,S.[shift]
,S.[machine]
FROM (SELECT M.[machine], T0.[user], T0.[date], T0.[shift]
FROM [HeapTableWithMachines] M, [TableWithLinesInsertedByThirdPerson] T0 GROUP BY M.[machine], T0.[user], T0.[date], T0.[shift]) S
LEFT JOIN [TableWithLinesInsertedByThirdPerson] T1 ON S.[date] = T1.[date] AND S.[machine] = T1.[machine] AND S.[shift] = T1.[shift] AND S.[user] = T1.[user] WHERE T1.[user] IS NULL
PS:我同意 Yitzhak Khabinsky 的觀點,即應該有更多資訊可以解決您的問題。
uj5u.com熱心網友回復:
人們會假設您的資料庫已正確規范化,因此您將擁有一張Users表和一張Shift表。您還將有一個Machine包含機器的表TG01- TG10。
您還需要一個名為 的日歷表Dates,其中包含每一天的一行。您可以即時生成它,但使用適當的表格會更容易
然后將它們全部交叉連接,并從表中洗掉匹配的行
SELECT *
FROM Users u
CROSS JOIN Shift s
CROSS JOIN Machine m
JOIN Dates d ON d.Date BETWEEN '20211101' AND CAST(GETDATE() AS date)
WHERE NOT EXISTS (SELECT 1
FROM YourTable sd
WHERE sd.[User] = u.Id
AND sd.Shift = s.Id
AND sd.Machine = m.Id);
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/368588.html
標籤:mysql sql sql-server 电源
上一篇:MySQL使用CAST更新列值
