【发布时间】:2020-08-12 18:02:45
【问题描述】:
一直在从事一个项目,该项目将从 SQL 查询生成报告。我希望显示包含以下任意组合的所有货件(基于唯一的自动卡车 ID):
- 唯一客户(基于客户编号,多个客户 每批货件数量)
- 唯一地址(基于定义的地址字段,多个唯一的 每批货物的地址)
当代码运行正确时,输出应该是这样的:
Truck Customer First Address (other addresses) City State ZIP Country
12345 C12345 567 Hummingbird Lane Detroit MI 48610 US
12345 C12345 908 Elm Street Detroit MI 48611 US
12345 C78901 219 Maple Street Lansing MI 49012 US
这是我试图梳理出这些信息的代码示例:
WITH cte
AS (SELECT DISTINCT shp.shipmentID
, ven.CustomerCode
, ven.CustomerName
, ads.FirstAddress
, ads.SecondAddress
, ads.ThirdAddress
, ads.City
, ads.State
, ads.Zip
, ads.Country
FROM
dbo.OrderItems AS ori
JOIN dbo.OrderLineProducts AS olns ON olns.olnID = ori.olnID
JOIN dbo.OrderLines AS oln ON oln.olnID = olns.olnID
JOIN dbo.Orders AS ord ON oln.ordID = ord.ordID
JOIN dbo.VendorCustomer AS ven ON ven.venID = ord.venID
JOIN dbo.OrderAddresses AS oa ON oa.ordID = ord.ordID
JOIN dbo.Address AS ads ON ads.addID = oa.addID
JOIN dbo.AddressType AS adst ON adst.atcID = ads.atcID
AND adst.atcAddressTypeCode = N'SHIP'
JOIN dbo.OrderItemShipments AS shpo ON ori.itmID = shpo.itmID
AND ori.itmIDInstance = shpo.itmIDInstance
AND ori.olnID = shpo.olnID
AND ori.olnIDInstance = shpo.olnIDInstance
JOIN dbo.Shipments AS shp ON shp.shipmentID = shpo.shpID
WHERE shpo.shpID = shp.shipmentID
AND ven.venCode IS NOT NULL
)
, maxadd
AS (SELECT
aa.venCode
, MAX(Multadd) AS Multadd
FROM (
SELECT
ROW_NUMBER() OVER (PARTITION BY cte.shipmentID, cte.CustomerCode ORDER BY cte.shipmentID) Multadd
, cte.shipmentID
, cte.CustomerCode
, cte.CustomerName
, cte.FirstAddress
, cte.SecondAddress
, cte.ThirdAddress
, cte.City
, cte.State
, cte.Zip
, cte.Country
FROM
cte
) AS aa
GROUP BY
aa.CustomerCode
HAVING COUNT (*)>1
)
, maxshp
AS (SELECT
cc.shipmentID
, MAX(cc.Multadd) AS MultVencode
FROM (
SELECT
bb.shipmentID
, bb.CustomerCode
, ROW_NUMBER() OVER (PARTITION BY shipmentID ORDER BY CustomerCode) Multadd
FROM (SELECT DISTINCT cte.shipmentID, cte.CustomerCode FROM cte) AS bb
) AS cc
GROUP BY
cc.shipmentID
HAVING COUNT(*) > 1
)
SELECT
cte.shipmentID
, cte.CustomerCode
, cte.CustomerName
, cte.FirstAddress
, cte.SecondAddress
, cte.ThirdAddress
, cte.City
, cte.State
, cte.Zip
, cte.Country
, maxadd.Multadd AS AddOnShipID
, maxshp.MultVencode AS VenOnShipID
FROM
cte
JOIN maxadd ON maxadd.CustomerCode = cte.CustomerCode
JOIN maxshp ON maxshp.shipmentID = cte.shipmentID
WHERE
(
maxadd.Multadd <> 2
AND maxshp.MultVencode <> 1
)
ORDER BY
cte.shipmentID
, cte.CustomerCode;
这个“准”有效。我一直在绞尽脑汁想为什么这仍然不起作用。想知道第二双眼睛是否会发现我忽略的东西。
【问题讨论】:
-
我已经回答了我自己的问题。我让它变得比我必须的更复杂,
标签: sql duplicates common-table-expression