При роботі з базами даних часто виникає потреба у видаленні продуктів або товарів, які не мають продажів протягом певного періоду, але все ще присутні в інвентарі. У цій статті ми розглянемо оптимізацію запиту SQL для вирішення цієї задачі.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
IF OBJECT_ID('tempdb..#tmpDiasatras') IS NOT NULL DROP TABLE #tmpDiasatras; -- Тимчасова таблиця для зберігання кількості днів SELECT DATEADD(DAY, -90, GETDATE()) as dias_transcurridos, vta.SUCURSAL as SucursalVenta, SUM(VENTA) as num_ventas, vta.CODIGO_PRODUCTO, SUCURSAL, vta.LINEA, vta.GRUPO, prod.EN_MANO as Existencia INTO #tmpDiasatras FROM ORACLE_INFO.dbo.tbl_VENTA_DIARIA as vta LEFT JOIN ORACLE_INFO.dbo.tbl_INVENTARIO_DIARIO prod ON vta.CODIGO_PRODUCTO = prod.PRODUCTO_DESC WHERE vta.FECHA > DATEADD(DAY, -90, GETDATE()) -- Продажі за останні 90 днів GROUP BY vta.SUCURSAL, vta.CODIGO_PRODUCTO, vta.LINEA, vta.GRUPO, prod.EN_MANO ORDER BY dias_transcurridos, vta.CODIGO_PRODUCTO, vta.LINEA, vta.GRUPO, prod.EN_MANO; -- Продукти без продажу за останні 90 днів -- Модифікований запит SELECT inv.CODIGO_PRODUCTO, inv.PRODUCTO_DESC, SUCURSAL, inv.LINEA, inv.GRUPO, inv.EN_MANO AS existencia FROM ORACLE_INFO.dbo.tbl_INVENTARIO_DIARIO as inv LEFT JOIN #tmpDiasatras ex ON ex.SUCURSAL = inv.SUCURSAL_DESC AND inv.FECHAACTUAL > ex.dias_transcurridos WHERE dias_transcurridos IS NULL GROUP BY inv.CODIGO_PRODUCTO, inv.PRODUCTO_DESC, SUCURSAL, inv.LINEA, inv.GRUPO, inv.EN_MANO HAVING COUNT(inv.SUCURSAL_DESC) > 0; |
При використанні даного SQL-запиту виникає проблема з тим, що значення стовпця “sucursal” видаються як NULL для всіх рядків. Треба зробити корекції в коді для вирішення цієї проблеми та оптимізації запиту.