SQL Server 2014 加入双行项目
SQL Server 2014 Join Doubling Line Items
如果我足够努力地搜索,我通常可以找到我的问题的答案,但我不知道如何恰当地表达我的问题以获得我想要的结果。
我遇到的问题是,我正在尝试将我的订单费用 Table 加入我的其他查询,以便我可以查看是否有折扣或运费。
订单费用中每个订单可能发生 3 种情况 Table(已应用折扣和运费)或(已应用折扣)或(已应用运费)
不允许使用 NULL 值,因此如果订单没有折扣或运费,它不会显示在此 table。
我的未应用订单费用的查询是:
SELECT
[Order].[OrderNumber],
CASE
WHEN [ShopifyOrder].[PaymentStatusCode] = '2' THEN 'Paid'
WHEN [ShopifyOrder].[PaymentStatusCode] = '4' THEN 'Refunded'
WHEN [ShopifyOrder].[PaymentStatusCode] = '5' THEN 'Voided'
WHEN [ShopifyOrder].[PaymentStatusCode] = '6' THEN 'Partially Refunded'
END AS 'PaymentStatus',
[Store].[StoreName] as 'MarketplaceNames',
[OrderItem].[SKU],
[LookupList].[MainSKU], [LookupList].[ProductName],
[LookupList].[Classification] as 'Classification',
[LookupList].[Cost],
([OrderItem].[Quantity] * [OrderItem].[UnitPrice]) AS 'Sales',
(([OrderItem].[Quantity] * [LookupList].[Quantity]) * [LookupList].[Cost]) AS 'Total Cost',
[OrderItem].[Quantity] * [LookupList].[Quantity] AS 'Total Qty'
FROM
[SHIPSERVER].[dbo].[Order]
JOIN
[SHIPSERVER].[dbo].[ShopifyOrder] ON [Order].[OrderID] = [ShopifyOrder].[OrderID]
JOIN
[SHIPSERVER].[dbo].[OrderItem] ON [OrderItem].[OrderID] = [Order].[OrderID]
JOIN
[SHIPSERVER].[dbo].[Store] ON [Order].[StoreID] = [Store].[StoreID]
LEFT JOIN
[SHIPSERVER].[dbo].[LookupList] ON [OrderItem].[SKU] = [LookupList].[SKU]
WHERE
([Store].[StoreName]= 'Shopify')
AND ([Order].[OrderDate] BETWEEN '2015-09-01 00:00:00.000' AND '2015-09-30 23:59:59.999')
AND ([Order].[IsManual] = '0')
我将在结果中给出 1 个订单作为示例
+-------------+---------------+------------------+---------------+---------------+----------------+-------+-------+------------+-----------+
| OrderNumber | PaymentStatus | MarketplaceNames | SKU | MainSKU | Classification | Cost | Sales | Total Cost | Total Qty |
| 7177 | Paid | Shopify | 300TLSH SL PL | 300TLSH SL PL | Sheet Set | 21.00 | 48.99 | 21 | 1 |
+-------------+---------------+------------------+---------------+---------------+----------------+-------+-------+------------+-----------+
这是我加入 OrderCharge
table 时的查询:
SELECT
[Order].[OrderNumber],
CASE
WHEN [ShopifyOrder].[PaymentStatusCode] = '2' THEN 'Paid'
WHEN [ShopifyOrder].[PaymentStatusCode] = '4' THEN 'Refunded'
WHEN [ShopifyOrder].[PaymentStatusCode] = '5' THEN 'Voided'
WHEN [ShopifyOrder].[PaymentStatusCode] = '6' THEN 'Partially Refunded'
END AS 'PaymentStatus',
[Store].[StoreName] as 'MarketplaceNames',
[OrderItem].[SKU],
[LookupList].[MainSKU],
[OrderCharge].[Type], [OrderCharge].[Description], [OrderCharge].[Amount],
[LookupList].[Classification] as 'Classification', [LookupList].[Cost],
([OrderItem].[Quantity]* [OrderItem].[UnitPrice]) AS 'Sales',
(([OrderItem].[Quantity] * [LookupList].[Quantity]) * [LookupList].[Cost]) AS 'Total Cost',
[OrderItem].[Quantity] * [LookupList].[Quantity] AS 'Total Qty'
FROM
[SHIPSERVER].[dbo].[Order]
JOIN
[SHIPSERVER].[dbo].[ShopifyOrder] ON [Order].[OrderID] = [ShopifyOrder].[OrderID]
JOIN
[SHIPSERVER].[dbo].[OrderItem] ON [OrderItem].[OrderID] = [Order].[OrderID]
JOIN
[SHIPSERVER].[dbo].[Store] ON [Order].[StoreID] = [Store].[StoreID]
LEFT JOIN
[SHIPSERVER].[dbo].[LookupList] ON [OrderItem].[SKU] = [LookupList].[SKU]
JOIN
[SHIPSERVER].[dbo].[OrderCharge] ON [Order].[OrderID] = [OrderCharge].[OrderID]
WHERE
([Store].[StoreName]= 'Shopify')
AND ([Order].[OrderDate] BETWEEN '2015-09-01 00:00:00.000' AND '2015-09-30 23:59:59.999')
AND ([Order].[IsManual] = '0')
我将再次给出与结果中示例相同的顺序
+-------------+---------------+------------------+---------------+---------------+----------+------------------------+--------+----------------+-------+-------+------------+-----------+
| OrderNumber | PaymentStatus | MarketplaceNames | SKU | MainSKU | Type | Description | Amount | Classification | Cost | Sales | Total Cost | Total Qty |
| 7177 | Paid | Shopify | 300TLSH SL PL | 300TLSH SL PL | DISCOUNT | 15chance | -7.35 | Sheet Set | 21.00 | 48.99 | 21 | 1 |
| 7177 | Paid | Shopify | 300TLSH SL PL | 300TLSH SL PL | SHIPPING | FREE Standard Shipping | 0.00 | Sheet Set | 21.00 | 48.99 | 21 | 1 |
+-------------+---------------+------------------+---------------+---------------+----------+------------------------+--------+----------------+-------+-------+------------+-----------+
如果我将其导出到一个 excel 文件中,成本、销售额和总数量字段现在都会为此订单翻倍,如果其中有多个行项目,这将成为一个更大的问题一个订单。
我认为一个解决方案是让折扣和运费字段成为它们自己的列,但所做的只是将折扣和运费放在同一行,但所有行项目仍然翻倍。
我得过去看点东西了。
SELECT [Order].[OrderNumber]
,CASE WHEN [ShopifyOrder].[PaymentStatusCode] = '2' THEN 'Paid'
WHEN [ShopifyOrder].[PaymentStatusCode] = '4' THEN 'Refunded'
WHEN [ShopifyOrder].[PaymentStatusCode] = '5' THEN 'Voided'
WHEN [ShopifyOrder].[PaymentStatusCode] = '6' THEN 'Partially Refunded'
END AS 'PaymentStatus'
,[Store].[StoreName] as 'MarketplaceNames'
,[OrderItem].[SKU]
,[LookupList].[MainSKU]
,[ShippingCharge].[Description] as shippingDescription
,[ShippingCharge].[Amount] as shippingAmount
,[DiscountCharge].[Description] as discountDescription
,[DiscountCharge].[Amount] as discountAmount
,[LookupList].[Classification] as 'Classification'
,[LookupList].[Cost]
,([OrderItem].[Quantity]* [OrderItem].[UnitPrice]) AS 'Sales'
,(([OrderItem].[Quantity] * [LookupList].[Quantity]) * [LookupList].[Cost]) AS 'Total Cost'
,[OrderItem].[Quantity] * [LookupList].[Quantity] AS 'Total Qty'
FROM [SHIPSERVER].[dbo].[Order]
JOIN [SHIPSERVER].[dbo].[ShopifyOrder]
ON [Order].[OrderID]=[ShopifyOrder].[OrderID]
JOIN [SHIPSERVER].[dbo].[OrderItem]
ON [OrderItem].[OrderID]=[Order].[OrderID]
JOIN [SHIPSERVER].[dbo].[Store]
ON [Order].[StoreID]=[Store].[StoreID]
LEFT JOIN [SHIPSERVER].[dbo].[LookupList]
ON [OrderItem].[SKU]=[LookupList].[SKU]
LEFT JOIN [SHIPSERVER].[dbo].[OrderCharge] [ShippingCharge]
ON [Order].[OrderID]=[ShippingCharge].[OrderID] AND [ShippingCharge].[Type] = 'SHIPPING'
LEFT JOIN [SHIPSERVER].[dbo].[OrderCharge] [DiscountCharge]
ON [Order].[OrderID]=[DiscountCharge].[OrderID] AND [DiscountCharge].[Type] = 'DISCOUNT'
WHERE ([Store].[StoreName]= 'Shopify')
AND ([Order].[OrderDate] BETWEEN '2015-09-01 00:00:00.000' AND '2015-09-30 23:59:59.999')
AND ([Order].[IsManual] = '0')
区别是:
,[ShippingCharge].[Description] as shippingDescription
,[ShippingCharge].[Amount] as shippingAmount
,[DiscountCharge].[Description] as discountDescription
,[DiscountCharge].[Amount] as discountAmount
和
LEFT JOIN [SHIPSERVER].[dbo].[OrderCharge] [ShippingCharge]
ON [Order].[OrderID]=[ShippingCharge].[OrderID] AND [ShippingCharge].[Type] = 'SHIPPING'
LEFT JOIN [SHIPSERVER].[dbo].[OrderCharge] [DiscountCharge]
ON [Order].[OrderID]=[DiscountCharge].[OrderID] AND [DiscountCharge].[Type] = 'DISCOUNT'
基本上,我所做的是两次加入 OrderCharge,一次用于折扣,一次用于运输,每次都使用不同的别名。这意味着您可能链接到折扣行并可能链接到发货行,从那里获取数据非常容易。
正如@thab 在评论中指出的那样,这方面存在明显的问题。首先,拥有多个 Shipping 或 Discount 条目将重复行,此时您必须在 [Amount] 上使用总和(并且可能在描述上使用 XML 连接)。这也意味着只要出现新的 ChargeOrder 类型,就必须更改查询。
想法解决方案是使用 Pivot,但我还没有涉足它,所以我无法帮助你。我确实相信数据透视表 运行 虽然速度较慢(好吧,至少动态的是这样),所以只要你的问题没有改变就没问题。
如果我足够努力地搜索,我通常可以找到我的问题的答案,但我不知道如何恰当地表达我的问题以获得我想要的结果。
我遇到的问题是,我正在尝试将我的订单费用 Table 加入我的其他查询,以便我可以查看是否有折扣或运费。
订单费用中每个订单可能发生 3 种情况 Table(已应用折扣和运费)或(已应用折扣)或(已应用运费)
不允许使用 NULL 值,因此如果订单没有折扣或运费,它不会显示在此 table。
我的未应用订单费用的查询是:
SELECT
[Order].[OrderNumber],
CASE
WHEN [ShopifyOrder].[PaymentStatusCode] = '2' THEN 'Paid'
WHEN [ShopifyOrder].[PaymentStatusCode] = '4' THEN 'Refunded'
WHEN [ShopifyOrder].[PaymentStatusCode] = '5' THEN 'Voided'
WHEN [ShopifyOrder].[PaymentStatusCode] = '6' THEN 'Partially Refunded'
END AS 'PaymentStatus',
[Store].[StoreName] as 'MarketplaceNames',
[OrderItem].[SKU],
[LookupList].[MainSKU], [LookupList].[ProductName],
[LookupList].[Classification] as 'Classification',
[LookupList].[Cost],
([OrderItem].[Quantity] * [OrderItem].[UnitPrice]) AS 'Sales',
(([OrderItem].[Quantity] * [LookupList].[Quantity]) * [LookupList].[Cost]) AS 'Total Cost',
[OrderItem].[Quantity] * [LookupList].[Quantity] AS 'Total Qty'
FROM
[SHIPSERVER].[dbo].[Order]
JOIN
[SHIPSERVER].[dbo].[ShopifyOrder] ON [Order].[OrderID] = [ShopifyOrder].[OrderID]
JOIN
[SHIPSERVER].[dbo].[OrderItem] ON [OrderItem].[OrderID] = [Order].[OrderID]
JOIN
[SHIPSERVER].[dbo].[Store] ON [Order].[StoreID] = [Store].[StoreID]
LEFT JOIN
[SHIPSERVER].[dbo].[LookupList] ON [OrderItem].[SKU] = [LookupList].[SKU]
WHERE
([Store].[StoreName]= 'Shopify')
AND ([Order].[OrderDate] BETWEEN '2015-09-01 00:00:00.000' AND '2015-09-30 23:59:59.999')
AND ([Order].[IsManual] = '0')
我将在结果中给出 1 个订单作为示例
+-------------+---------------+------------------+---------------+---------------+----------------+-------+-------+------------+-----------+
| OrderNumber | PaymentStatus | MarketplaceNames | SKU | MainSKU | Classification | Cost | Sales | Total Cost | Total Qty |
| 7177 | Paid | Shopify | 300TLSH SL PL | 300TLSH SL PL | Sheet Set | 21.00 | 48.99 | 21 | 1 |
+-------------+---------------+------------------+---------------+---------------+----------------+-------+-------+------------+-----------+
这是我加入 OrderCharge
table 时的查询:
SELECT
[Order].[OrderNumber],
CASE
WHEN [ShopifyOrder].[PaymentStatusCode] = '2' THEN 'Paid'
WHEN [ShopifyOrder].[PaymentStatusCode] = '4' THEN 'Refunded'
WHEN [ShopifyOrder].[PaymentStatusCode] = '5' THEN 'Voided'
WHEN [ShopifyOrder].[PaymentStatusCode] = '6' THEN 'Partially Refunded'
END AS 'PaymentStatus',
[Store].[StoreName] as 'MarketplaceNames',
[OrderItem].[SKU],
[LookupList].[MainSKU],
[OrderCharge].[Type], [OrderCharge].[Description], [OrderCharge].[Amount],
[LookupList].[Classification] as 'Classification', [LookupList].[Cost],
([OrderItem].[Quantity]* [OrderItem].[UnitPrice]) AS 'Sales',
(([OrderItem].[Quantity] * [LookupList].[Quantity]) * [LookupList].[Cost]) AS 'Total Cost',
[OrderItem].[Quantity] * [LookupList].[Quantity] AS 'Total Qty'
FROM
[SHIPSERVER].[dbo].[Order]
JOIN
[SHIPSERVER].[dbo].[ShopifyOrder] ON [Order].[OrderID] = [ShopifyOrder].[OrderID]
JOIN
[SHIPSERVER].[dbo].[OrderItem] ON [OrderItem].[OrderID] = [Order].[OrderID]
JOIN
[SHIPSERVER].[dbo].[Store] ON [Order].[StoreID] = [Store].[StoreID]
LEFT JOIN
[SHIPSERVER].[dbo].[LookupList] ON [OrderItem].[SKU] = [LookupList].[SKU]
JOIN
[SHIPSERVER].[dbo].[OrderCharge] ON [Order].[OrderID] = [OrderCharge].[OrderID]
WHERE
([Store].[StoreName]= 'Shopify')
AND ([Order].[OrderDate] BETWEEN '2015-09-01 00:00:00.000' AND '2015-09-30 23:59:59.999')
AND ([Order].[IsManual] = '0')
我将再次给出与结果中示例相同的顺序
+-------------+---------------+------------------+---------------+---------------+----------+------------------------+--------+----------------+-------+-------+------------+-----------+
| OrderNumber | PaymentStatus | MarketplaceNames | SKU | MainSKU | Type | Description | Amount | Classification | Cost | Sales | Total Cost | Total Qty |
| 7177 | Paid | Shopify | 300TLSH SL PL | 300TLSH SL PL | DISCOUNT | 15chance | -7.35 | Sheet Set | 21.00 | 48.99 | 21 | 1 |
| 7177 | Paid | Shopify | 300TLSH SL PL | 300TLSH SL PL | SHIPPING | FREE Standard Shipping | 0.00 | Sheet Set | 21.00 | 48.99 | 21 | 1 |
+-------------+---------------+------------------+---------------+---------------+----------+------------------------+--------+----------------+-------+-------+------------+-----------+
如果我将其导出到一个 excel 文件中,成本、销售额和总数量字段现在都会为此订单翻倍,如果其中有多个行项目,这将成为一个更大的问题一个订单。
我认为一个解决方案是让折扣和运费字段成为它们自己的列,但所做的只是将折扣和运费放在同一行,但所有行项目仍然翻倍。
我得过去看点东西了。
SELECT [Order].[OrderNumber]
,CASE WHEN [ShopifyOrder].[PaymentStatusCode] = '2' THEN 'Paid'
WHEN [ShopifyOrder].[PaymentStatusCode] = '4' THEN 'Refunded'
WHEN [ShopifyOrder].[PaymentStatusCode] = '5' THEN 'Voided'
WHEN [ShopifyOrder].[PaymentStatusCode] = '6' THEN 'Partially Refunded'
END AS 'PaymentStatus'
,[Store].[StoreName] as 'MarketplaceNames'
,[OrderItem].[SKU]
,[LookupList].[MainSKU]
,[ShippingCharge].[Description] as shippingDescription
,[ShippingCharge].[Amount] as shippingAmount
,[DiscountCharge].[Description] as discountDescription
,[DiscountCharge].[Amount] as discountAmount
,[LookupList].[Classification] as 'Classification'
,[LookupList].[Cost]
,([OrderItem].[Quantity]* [OrderItem].[UnitPrice]) AS 'Sales'
,(([OrderItem].[Quantity] * [LookupList].[Quantity]) * [LookupList].[Cost]) AS 'Total Cost'
,[OrderItem].[Quantity] * [LookupList].[Quantity] AS 'Total Qty'
FROM [SHIPSERVER].[dbo].[Order]
JOIN [SHIPSERVER].[dbo].[ShopifyOrder]
ON [Order].[OrderID]=[ShopifyOrder].[OrderID]
JOIN [SHIPSERVER].[dbo].[OrderItem]
ON [OrderItem].[OrderID]=[Order].[OrderID]
JOIN [SHIPSERVER].[dbo].[Store]
ON [Order].[StoreID]=[Store].[StoreID]
LEFT JOIN [SHIPSERVER].[dbo].[LookupList]
ON [OrderItem].[SKU]=[LookupList].[SKU]
LEFT JOIN [SHIPSERVER].[dbo].[OrderCharge] [ShippingCharge]
ON [Order].[OrderID]=[ShippingCharge].[OrderID] AND [ShippingCharge].[Type] = 'SHIPPING'
LEFT JOIN [SHIPSERVER].[dbo].[OrderCharge] [DiscountCharge]
ON [Order].[OrderID]=[DiscountCharge].[OrderID] AND [DiscountCharge].[Type] = 'DISCOUNT'
WHERE ([Store].[StoreName]= 'Shopify')
AND ([Order].[OrderDate] BETWEEN '2015-09-01 00:00:00.000' AND '2015-09-30 23:59:59.999')
AND ([Order].[IsManual] = '0')
区别是:
,[ShippingCharge].[Description] as shippingDescription
,[ShippingCharge].[Amount] as shippingAmount
,[DiscountCharge].[Description] as discountDescription
,[DiscountCharge].[Amount] as discountAmount
和
LEFT JOIN [SHIPSERVER].[dbo].[OrderCharge] [ShippingCharge]
ON [Order].[OrderID]=[ShippingCharge].[OrderID] AND [ShippingCharge].[Type] = 'SHIPPING'
LEFT JOIN [SHIPSERVER].[dbo].[OrderCharge] [DiscountCharge]
ON [Order].[OrderID]=[DiscountCharge].[OrderID] AND [DiscountCharge].[Type] = 'DISCOUNT'
基本上,我所做的是两次加入 OrderCharge,一次用于折扣,一次用于运输,每次都使用不同的别名。这意味着您可能链接到折扣行并可能链接到发货行,从那里获取数据非常容易。
正如@thab 在评论中指出的那样,这方面存在明显的问题。首先,拥有多个 Shipping 或 Discount 条目将重复行,此时您必须在 [Amount] 上使用总和(并且可能在描述上使用 XML 连接)。这也意味着只要出现新的 ChargeOrder 类型,就必须更改查询。
想法解决方案是使用 Pivot,但我还没有涉足它,所以我无法帮助你。我确实相信数据透视表 运行 虽然速度较慢(好吧,至少动态的是这样),所以只要你的问题没有改变就没问题。