日常涨知识系列-惊天地泣鬼神的 sql, 300 行~~

2020-12-23 14:19:12 +08:00
 funbox

没有别的意思就是想让大家,长长见识~ 能看懂算我输

SELECT
	* 
FROM
	(
	SELECT
		`inventory`.`id` AS `inventoryId`,
		`inventory`.`location_id` AS `locationId`,
		`inventory`.`storehouse_id` AS `storehouseId`,
		`product`.`id` AS `productId`,
		`product`.`name` AS `name`,
		`product`.`number` AS `number`,
		`brand`.`name` AS `brandName`,
		`product`.`size` AS `size`,
		`category`.`name` AS `categoryName`,
		`product`.`unit` AS `unit`,
		`storehouse`.`name` AS `storehouseName`,
		`location`.`name` AS `locationName`,
		IFNULL( inventory.quantity, 0 ) AS `remainQuantity`,
		IFNULL( inventoryBath.avgPrice, 0 ) AS `avgPrice`,
		IFNULL( inventoryBath.totalPrice, 0 ) AS `totalPrice`,
		`inventoryWarning`.`lowerLimit` AS `lowerLimit`,
		`inventoryWarning`.`upperLimit` AS `upperLimit`,(
			IFNULL( repairOrderItem.repairRemainQuantity, 0 )+ IFNULL( purchaseReturnOrderItem.purchaseReturnRemainQuantity, 0 )+ IFNULL( otherOutOrderItem.otherInOutstockQuantity, 0 )) AS `waitOutQuantity`,(
		IFNULL( purchaseOrderItem.purchaseRemainQuantity, 0 )+ IFNULL( otherInOrderItem.otherInOutstockQuantity, 0 )+ IFNULL( onlineInOrderItem.onlineRemainInstockQuantity, 0 )) AS `waitIntQuantity`,
		`product`.`barcode` AS `barcode`,
		`supplier`.`name` AS `supplierName`,
		`product`.`valid_period` AS `validPeriod`,
		`product`.`standard_id` AS `standardId`,
		`product`.`from_id` AS `fromId`,
		`product`.`source` AS `source`,
		`oeTable`.`oeNumber` AS `oeNumber`,
		`product`.`vehicle_note` AS `vehicleNote`,
		`product`.`description` AS `note`,
		`store`.`name` AS `storeName`,
		`product`.`create_time` AS `createTime`,
		`inventory`.`tenant_id`,
		`product`.`sale_price1` AS `productSalePrice`,
		`product`.`price_mode` AS `productPriceMode`,
		`product`.`markup_type` AS `productMarkupType`,
		IFNULL( lastPurchasePrice.lastPurchasePrice, 0 ) AS `lastPurchasePrice`,(
		CASE
				
				WHEN product.price_mode = 1 THEN
				product.sale_price1 
				WHEN product.price_mode = 2 
				AND product.markup_type = 1 
				AND IFNULL( inventory.quantity, 0 )= 0 THEN
					IFNULL( lastOutPrice.unitPrice, 0 )* product.sale_price1 
					WHEN product.price_mode = 2 
					AND product.markup_type = 1 
					AND IFNULL( inventory.quantity, 0 ) != 0 THEN
						IFNULL( inventoryBath.avgPrice, 0 )* product.sale_price1 
						WHEN product.price_mode = 2 
						AND product.markup_type != 1 THEN
							IFNULL( lastPurchasePrice.lastPurchasePrice, 0 )* product.sale_price1 
						END 
						) AS salePrice 
					FROM
						`inventory`
						LEFT JOIN `product` ON `inventory`.`product_id` = `product`.`id`
						LEFT JOIN `category` ON `product`.`category_id` = `category`.`id`
						LEFT JOIN `brand` ON `product`.`brand_id` = `brand`.`id`
						LEFT JOIN `storehouse` ON `inventory`.`storehouse_id` = `storehouse`.`id`
						LEFT JOIN `location` ON `inventory`.`location_id` = `location`.`id`
						LEFT JOIN `supplier` ON `product`.`supplier_id` = `supplier`.`id`
						LEFT JOIN `store` ON `inventory`.`store_id` = `store`.`id`
						LEFT JOIN (
						SELECT
							SUBSTRING_INDEX(
								GROUP_CONCAT( unit_price ORDER BY outstock_time DESC ),
								',',
								1 
							) AS `unitPrice`,
							`product_id` AS `productId` 
						FROM
							`inventory_batch` 
						WHERE
							( `store_id` = '27358' ) 
							AND ( `inventory_batch`.`tenant_id` = 1 ) 
						GROUP BY
							`product_id` 
						) `lastOutPrice` ON `inventory`.`product_id` = lastOutPrice.productId
						LEFT JOIN (
						SELECT
							group_concat( product_number.number SEPARATOR ";" ) AS `oeNumber`,
						`product_number`.`product_id` AS `productId` 
						FROM
							`product_number` 
						WHERE
							( `product_number`.`type` = 1 ) 
							AND ( `product_number`.`tenant_id` = 1 ) 
						GROUP BY
							`product_number`.`product_id` 
						) `oeTable` ON `inventory`.`product_id` = oeTable.productId
						LEFT JOIN (
						SELECT
							`storehouse_id` AS `storehouseId`,
							SUM( quantity )- SUM( outstock_quantity ) AS `remainQuantity`,
							SUM(
								unit_price *(
									quantity - outstock_quantity 
								)) AS `totalPrice`,
							`product_id` AS `productId`,
						IF
							(
								inventoryBathAll.currentQuantity = 0,
								inventoryBathLast.unitPrice,
							round( inventoryBathAll.avgPrice, 2 )) AS `avgPrice` 
						FROM
							`inventory_batch`
							LEFT JOIN (
							SELECT
								`product_id` AS `productId`,
								SUM( quantity )- SUM( outstock_quantity ) AS `currentQuantity`,
								CONVERT (
									SUM(
										unit_price *(
											quantity - outstock_quantity 
										))/(
									SUM( quantity )- SUM( outstock_quantity )),
								DECIMAL ( 20, 2 )) AS `avgPrice` 
							FROM
								`inventory_batch` 
							WHERE
								( `store_id` = '27358' ) 
								AND ( `inventory_batch`.`tenant_id` = 1 ) 
							GROUP BY
								`product_id` 
							) `inventoryBathAll` ON `inventory_batch`.`product_id` = inventoryBathAll.productId
							LEFT JOIN (
							SELECT
								SUBSTRING_INDEX(
									GROUP_CONCAT( unit_price ORDER BY batch_number DESC ),
									",",
									1 
								) AS `unitPrice`,
								`product_id` AS `productId`,
								max( batch_number ) AS `batchNumber` 
							FROM
								`inventory_batch` 
							WHERE
								( `store_id` = '27358' ) 
								AND ( `inventory_batch`.`tenant_id` = 1 ) 
							GROUP BY
								`product_id` 
							ORDER BY
								`batch_number` DESC 
							) `inventoryBathLast` ON `inventory_batch`.`product_id` = inventoryBathLast.productId 
						WHERE
							( `store_id` = '27358' ) 
							AND ( `inventory_batch`.`tenant_id` = 1 ) 
						GROUP BY
							`product_id`,
							`storehouse_id` 
						) `inventoryBath` ON ( `inventory`.`product_id` = inventoryBath.productId ) 
						AND ( `inventory`.`storehouse_id` = inventoryBath.storehouseId )
						LEFT JOIN (
						SELECT
							`product_id` AS `productId`,
							`lower_limit` AS `lowerLimit`,
							`upper_limit` AS `upperLimit` 
						FROM
							`inventory_warning` 
						WHERE
							( `store_id` = '27358' ) 
						AND ( `inventory_warning`.`tenant_id` = 1 )) `inventoryWarning` ON `inventory`.`product_id` = inventoryWarning.productId
						LEFT JOIN (
						SELECT
							SUM( repair_order_product_item.quantity - repair_order_product_item.use_quantity ) AS `repairRemainQuantity`,
							`repair_order_product_item`.`product_id` AS `productId` 
						FROM
							`repair_order_product_item`
							INNER JOIN (
							SELECT
								* 
							FROM
								`repair_order` 
							WHERE
								( `status` != 21000 ) 
								AND ( `repair_order`.`store_id` = '27358' ) 
							AND ( `repair_order`.`tenant_id` = 1 )) `repairOrder` ON `repair_order_product_item`.`order_id` = repairOrder.id
							INNER JOIN (
							SELECT DISTINCT
								`product_id` 
							FROM
								`inventory` 
							WHERE
								( `store_id` = '27358' ) 
								AND ( `inventory`.`tenant_id` = 1 ) 
							GROUP BY
								`product_id` 
							) `inventoryQue` ON `repair_order_product_item`.`product_id` = inventoryQue.product_id 
						WHERE
							`repair_order_product_item`.`tenant_id` = 1 
						GROUP BY
							`repair_order_product_item`.`product_id` 
						) `repairOrderItem` ON `inventory`.`product_id` = repairOrderItem.productId
						LEFT JOIN (
						SELECT
							SUM( purchase_return_order_item.quantity - purchase_return_order_item.outstock_quantity ) AS `purchaseReturnRemainQuantity`,
							`purchase_return_order_item`.`product_id` AS `productId` 
						FROM
							`purchase_return_order_item`
							INNER JOIN (
							SELECT
								* 
							FROM
								`purchase_return_order` 
							WHERE
								(
								`purchase_return_order`.`status` IN ( 12000, 13000 )) 
								AND ( `purchase_return_order`.`store_id` = '27358' ) 
							AND ( `purchase_return_order`.`tenant_id` = 1 )) `purchaseReturnOrder` ON `purchase_return_order_item`.`order_id` = purchaseReturnOrder.id 
						WHERE
							`purchase_return_order_item`.`tenant_id` = 1 
						GROUP BY
							`purchase_return_order_item`.`product_id` 
						) `purchaseReturnOrderItem` ON `inventory`.`product_id` = purchaseReturnOrderItem.productId
						LEFT JOIN (
						SELECT
							SUM( other_in_out_stock_order_item.quantity ) AS `otherInOutstockQuantity`,
							`other_in_out_stock_order_item`.`product_id` AS `productId` 
						FROM
							`other_in_out_stock_order_item`
							INNER JOIN (
							SELECT
								* 
							FROM
								`other_in_out_stock_order` 
							WHERE
								( `other_in_out_stock_order`.`type` = 1 ) 
								AND ( `other_in_out_stock_order`.`status` = 1 ) 
								AND ( `other_in_out_stock_order`.`store_id` = '27358' ) 
							AND ( `other_in_out_stock_order`.`tenant_id` = 1 )) `otherInOutOrder` ON `other_in_out_stock_order_item`.`order_id` = otherInOutOrder.id 
						WHERE
							`other_in_out_stock_order_item`.`tenant_id` = 1 
						GROUP BY
							`other_in_out_stock_order_item`.`product_id` 
						) `otherOutOrderItem` ON `inventory`.`product_id` = otherOutOrderItem.productId
						LEFT JOIN (
						SELECT
							SUM( purchase_order_item.quantity - purchase_order_item.instock_quantity ) AS `purchaseRemainQuantity`,
							`purchase_order_item`.`product_id` AS `productId` 
						FROM
							`purchase_order_item`
							INNER JOIN (
							SELECT
								* 
							FROM
								`purchase_order` 
							WHERE
								(
								`purchase_order`.`status` IN ( 12000, 13000 )) 
								AND ( `purchase_order`.`store_id` = '27358' ) 
							AND ( `purchase_order`.`tenant_id` = 1 )) `purchaseOrder` ON `purchase_order_item`.`order_id` = purchaseOrder.id 
						WHERE
							`purchase_order_item`.`tenant_id` = 1 
						GROUP BY
							`purchase_order_item`.`product_id` 
						) `purchaseOrderItem` ON `inventory`.`product_id` = purchaseOrderItem.productId
						LEFT JOIN (
						SELECT
							SUM( other_in_out_stock_order_item.quantity ) AS `otherInOutstockQuantity`,
							`other_in_out_stock_order_item`.`product_id` AS `productId` 
						FROM
							`other_in_out_stock_order_item`
							INNER JOIN (
							SELECT
								* 
							FROM
								`other_in_out_stock_order` 
							WHERE
								( `other_in_out_stock_order`.`type` = 2 ) 
								AND ( `other_in_out_stock_order`.`status` = 1 ) 
								AND ( `other_in_out_stock_order`.`store_id` = '27358' ) 
							AND ( `other_in_out_stock_order`.`tenant_id` = 1 )) `otherInOutOrder` ON `other_in_out_stock_order_item`.`order_id` = otherInOutOrder.id 
						WHERE
							`other_in_out_stock_order_item`.`tenant_id` = 1 
						GROUP BY
							`other_in_out_stock_order_item`.`product_id` 
						) `otherInOrderItem` ON `inventory`.`product_id` = otherInOrderItem.productId
						LEFT JOIN (
						SELECT
							SUM( online_purchase_order_item.quantity - online_purchase_order_item.instock_quantity ) AS `onlineRemainInstockQuantity`,
							`online_purchase_order_item`.`product_id` AS `productId` 
						FROM
							`online_purchase_order_item`
							INNER JOIN (
							SELECT
								* 
							FROM
								`online_purchase_order` 
							WHERE
								( `online_purchase_order`.`status` = 1 ) 
								AND ( `online_purchase_order`.`store_id` = '27358' ) 
							AND ( `online_purchase_order`.`tenant_id` = 1 )) `onlineOrder` ON `online_purchase_order_item`.`order_id` = onlineOrder.id 
						WHERE
							`online_purchase_order_item`.`tenant_id` = 1 
						GROUP BY
							`online_purchase_order_item`.`product_id` 
						) `onlineInOrderItem` ON `inventory`.`product_id` = onlineInOrderItem.productId
						LEFT JOIN (
						SELECT
							`product_id` AS `productId`,
							`last_price` AS `lastPurchasePrice` 
						FROM
							`purchase_price` 
						WHERE
							( `store_id` = '27358' ) 
						AND ( `purchase_price`.`tenant_id` = 1 )) `lastPurchasePrice` ON `inventory`.`product_id` = lastPurchasePrice.productId 
					WHERE
						( `product`.`status` != 90 ) 
						AND ( `inventory`.`store_id` = '27358' ) 
					AND ( `inventory`.`tenant_id` = 1 )) `table` 
				WHERE
					`table`.`tenant_id` = 1 
				ORDER BY
				`createTime` DESC 
	LIMIT 10
13439 次点击
所在节点    MySQL
109 条回复
x66
2020-12-24 09:08:10 +08:00
ERP 报表开发者的日常,这也就一般难度的 sql 吧
MoccaCafe
2020-12-24 09:10:52 +08:00
这个还行吧,起码没有各种存储过程和未知名的临时表,基本看得懂。 如果联表过于复杂,得考虑是否设计欠佳,业务跟不上
ZinWUT
2020-12-24 09:26:02 +08:00
ERP 业务的日常,hhh
tianhei826
2020-12-24 09:26:25 +08:00
写个 MERGE 那么难吗。。。。。
c6h6benzene
2020-12-24 09:27:31 +08:00
300 行,这才刚开始写吧。除了 Select *之外好像也没啥好吐槽的了。
jorneyr
2020-12-24 09:30:31 +08:00
这是人才,得好好保护
Nicoco
2020-12-24 09:32:35 +08:00
感觉,再搞搞,是不是会崩溃
Achiii
2020-12-24 09:48:15 +08:00
数仓抽数的 sql 都很长
junwind
2020-12-24 10:03:51 +08:00
虽然不建议这么做,但是写得出来这样的 sql,也是牛啊
kimqcn
2020-12-24 10:15:53 +08:00
交给最新的量子霸权计算机处理看看
neptuno
2020-12-24 10:21:16 +08:00
楼上各位都不审题吗,,这是用户行为可以随意触发的,,,肯定不能这样写呀
ojbkojbk
2020-12-24 10:23:38 +08:00
正常操作 之前写报表比这还骚
solaya
2020-12-24 10:25:49 +08:00
这个 SQL 写的不错
onice
2020-12-24 10:31:44 +08:00
看能算你输,所以我没看懂,你赢了。这一坨写的真好,我都看不懂。
jitongxi
2020-12-24 12:07:45 +08:00
五千行的存储过程都见过, 这算啥
Frank9621
2020-12-24 13:24:59 +08:00
兄弟,你这样直接把 sql 贴出来不好吧
funbox
2020-12-24 16:54:06 +08:00
@Frank9621 有些字段 表前缀已经替换~~
yanue
2020-12-24 17:01:40 +08:00
这不是应该算一行吗
clf
2020-12-24 17:39:14 +08:00
估计是可视化的 SQL 查询构造器构造的。
runninghipp
2020-12-24 18:42:32 +08:00
这个是报表数据把

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/738226

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX