Advertisement
JanuszKowalski123

oze2

Apr 15th, 2024 (edited)
32
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 6.75 KB | None | 0 0
  1. -- Tworzenie tabeli klientów
  2. CREATE TABLE Customers (
  3.     customer_id INT PRIMARY KEY,
  4.     name VARCHAR(255),
  5.     email VARCHAR(255),
  6.     phone VARCHAR(20),
  7.     address VARCHAR(255)
  8. );
  9.  
  10. -- Tworzenie tabeli urządzeń OZE
  11. CREATE TABLE Renewable_Energy_Devices (
  12.     device_id NVARCHAR(26) PRIMARY KEY,
  13.     device_status INT CHECK (device_status >= 0 AND device_status <= 6),
  14.     installation_date DATE,
  15.     last_maintenance_date DATE
  16. );
  17.  
  18. -- Tworzenie tabeli zgłoszeń awarii
  19. CREATE TABLE Device_Failures (
  20.     failure_id INT PRIMARY KEY IDENTITY,
  21.     device_id NVARCHAR(26),
  22.     failure_start DATETIME,
  23.     failure_end DATETIME,
  24.     failure_reason NVARCHAR(255),
  25.     FOREIGN KEY (device_id) REFERENCES Renewable_Energy_Devices(device_id)
  26. );
  27.  
  28. -- Tworzenie tabeli napraw
  29. CREATE TABLE Repairs (
  30.     repair_id INT PRIMARY KEY IDENTITY,
  31.     device_id NVARCHAR(26),
  32.     repair_start DATETIME,
  33.     repair_end DATETIME,
  34.     repair_description NVARCHAR(255),
  35.     FOREIGN KEY (device_id) REFERENCES Renewable_Energy_Devices(device_id)
  36. );
  37.  
  38. -- Tworzenie tabeli zmian serwisowych
  39. CREATE TABLE Service_Shifts (
  40.     shift_id INT PRIMARY KEY IDENTITY,
  41.     shift_date DATE,
  42.     shift_type INT CHECK (shift_type >= 1 AND shift_type <= 3),
  43.     start_time TIME,
  44.     end_time TIME
  45. );
  46.  
  47.  
  48.  
  49.  
  50. -- Wstawianie 500 przykładowych danych do tabeli urządzeń OZE
  51. DECLARE @Counter INT = 1;
  52.  
  53. WHILE @Counter <= 500
  54. BEGIN
  55.     DECLARE @DeviceId NVARCHAR(26) = CONCAT('Device_', @Counter);
  56.     DECLARE @InstallationDate DATE = DATEADD(DAY, -RAND() * 365, GETDATE()); -- Losowa data instalacji z ostatniego roku
  57.     DECLARE @LastMaintenanceDate DATE = DATEADD(DAY, -RAND() * 180, GETDATE()); -- Losowa data ostatniego przeglądu z ostatnich 6 miesięcy
  58.     DECLARE @DeviceStatus INT = CAST(RAND() * 6 AS INT); -- Losowy status urządzenia
  59.    
  60.     INSERT INTO Renewable_Energy_Devices (device_id, device_status, installation_date, last_maintenance_date)
  61.     VALUES (@DeviceId, @DeviceStatus, @InstallationDate, @LastMaintenanceDate);
  62.    
  63.     SET @Counter = @Counter + 1;
  64. END;
  65.  
  66.  
  67. -- Wstawianie danych do tabeli zmian serwisowych (poniedziałek - sobota)
  68. INSERT INTO Service_Shifts (shift_date, shift_type, start_time, end_time) VALUES
  69. ('2024-04-01', 1, '06:00:00', '14:00:00'),
  70. ('2024-04-01', 2, '14:00:00', '22:00:00'),
  71. ('2024-04-01', 3, '22:00:00', '06:00:00'),
  72. ('2024-04-02', 1, '06:00:00', '14:00:00'),
  73. ('2024-04-02', 2, '14:00:00', '22:00:00'),
  74. ('2024-04-02', 3, '22:00:00', '06:00:00'),
  75. ('2024-04-03', 1, '06:00:00', '14:00:00'),
  76. ('2024-04-03', 2, '14:00:00', '22:00:00'),
  77. ('2024-04-03', 3, '22:00:00', '06:00:00'),
  78. ('2024-04-04', 1, '06:00:00', '14:00:00'),
  79. ('2024-04-04', 2, '14:00:00', '22:00:00'),
  80. ('2024-04-04', 3, '22:00:00', '06:00:00'),
  81. ('2024-04-05', 1, '06:00:00', '14:00:00'),
  82. ('2024-04-05', 2, '14:00:00', '22:00:00'),
  83. ('2024-04-05', 3, '22:00:00', '06:00:00'),
  84. ('2024-04-06', 1, '06:00:00', '14:00:00'),
  85. ('2024-04-06', 2, '14:00:00', '22:00:00'),
  86. ('2024-04-06', 3, '22:00:00', '06:00:00');
  87.  
  88. --############################################################################
  89.  
  90. -- Wstawianie 100 przykładowych danych do tabeli klientów
  91. DECLARE @Counter INT = 1;
  92.  
  93. WHILE @Counter <= 100
  94. BEGIN
  95.     DECLARE @Name VARCHAR(255) = 'Customer' + CAST(@Counter AS VARCHAR);
  96.     DECLARE @Email VARCHAR(255) = 'customer' + CAST(@Counter AS VARCHAR) + '@example.com';
  97.     DECLARE @Phone VARCHAR(20) = '123-456-789' + CAST(@Counter AS VARCHAR);
  98.     DECLARE @Address VARCHAR(255) = 'Address' + CAST(@Counter AS VARCHAR);
  99.    
  100.     INSERT INTO Customers (customer_id, name, email, phone, address)
  101.     VALUES (@Counter, @Name, @Email, @Phone, @Address);
  102.    
  103.     SET @Counter = @Counter + 1;
  104. END;
  105.  
  106. -- Wstawianie 1000 przykładowych danych do tabeli zgłoszeń awarii
  107. DECLARE @Counter INT = 1;
  108.  
  109. WHILE @Counter <= 1000
  110. BEGIN
  111.     DECLARE @FailureStart DATETIME = DATEADD(DAY, -RAND() * 365, GETDATE()); -- Losowa data rozpoczęcia awarii z ostatniego roku
  112.     DECLARE @FailureEnd DATETIME = DATEADD(HOUR, RAND() * 24, @FailureStart); -- Losowa data zakończenia awarii w ciągu 24 godzin od rozpoczęcia
  113.     DECLARE @FailureReason NVARCHAR(255) = 'Failure reason ' + CAST(@Counter AS NVARCHAR); -- Powód awarii
  114.    
  115.     INSERT INTO Device_Failures (failure_start, failure_end, failure_reason)
  116.     VALUES (@FailureStart, @FailureEnd, @FailureReason);
  117.    
  118.     SET @Counter = @Counter + 1;
  119. END;
  120.  
  121.  
  122.  
  123. -- Wstawianie 1000 przykładowych danych do tabeli napraw bez uwzględnienia pola device_id
  124. DECLARE @Counter INT = 1;
  125.  
  126. WHILE @Counter <= 1000
  127. BEGIN
  128.     DECLARE @RepairStart DATETIME = DATEADD(DAY, -RAND() * 365, GETDATE()); -- Losowa data rozpoczęcia naprawy z ostatniego roku
  129.     DECLARE @RepairEnd DATETIME = DATEADD(HOUR, RAND() * 24, @RepairStart); -- Losowa data zakończenia naprawy w ciągu 24 godzin od rozpoczęcia
  130.     DECLARE @RepairDescription NVARCHAR(255) = 'Repair description ' + CAST(@Counter AS NVARCHAR); -- Opis naprawy
  131.    
  132.     INSERT INTO Repairs (repair_start, repair_end, repair_description)
  133.     VALUES (@RepairStart, @RepairEnd, @RepairDescription);
  134.    
  135.     SET @Counter = @Counter + 1;
  136. END;
  137.  
  138.  
  139.  
  140.  
  141.  
  142.  
  143.  
  144.  
  145. --#############################################################################
  146.  
  147. -- 1. Na jakiej zmianie dane urządzenie OZE uległo awarii
  148. SELECT df.device_id, ss.shift_id
  149. FROM Device_Failures df
  150. INNER JOIN Service_Shifts ss ON df.failure_start BETWEEN CONVERT(DATETIME, CONVERT(DATE, ss.shift_date)) + ss.start_time
  151.                                AND DATEADD(DAY, IIF(ss.start_time >= ss.end_time, 1, 0), CONVERT(DATETIME, CONVERT(DATE, ss.shift_date)) + ss.end_time)
  152.  
  153. -- 2. Na jakiej zmianie urządzenie OZE zostało naprawione
  154. SELECT r.device_id, ss.shift_id
  155. FROM Repairs r
  156. INNER JOIN Service_Shifts ss ON r.repair_end BETWEEN CONVERT(DATETIME, CONVERT(DATE, ss.shift_date)) + ss.start_time
  157.                                AND DATEADD(DAY, IIF(ss.start_time >= ss.end_time, 1, 0), CONVERT(DATETIME, CONVERT(DATE, ss.shift_date)) + ss.end_time)
  158.  
  159. -- 3. Jaki był czas przestoju danego urządzenia OZE w ciągu zadanego okresu czasu
  160. SELECT df.device_id, SUM(DATEDIFF(HOUR, df.failure_start, df.failure_end)) AS downtime_hours
  161. FROM Device_Failures df
  162. GROUP BY df.device_id
  163.  
  164. -- 4. Jaki był czas przestoju danego urządzenia OZE w ciągu zadanego okresu czasu nie wliczając w to czasu kiedy firma serwisująca nie pracowała (weekendy)
  165. SELECT df.device_id, SUM(DATEDIFF(HOUR, df.failure_start, df.failure_end)) AS downtime_hours
  166. FROM Device_Failures df
  167. INNER JOIN Service_Shifts ss ON df.failure_start BETWEEN CONVERT(DATETIME, CONVERT(DATE, ss.shift_date)) + ss.start_time
  168.                                AND DATEADD(DAY, IIF(ss.start_time >= ss.end_time, 1, 0), CONVERT(DATETIME, CONVERT(DATE, ss.shift_date)) + ss.end_time)
  169. WHERE DATEPART(WEEKDAY, df.failure_start)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement