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,但我还没有涉足它,所以我无法帮助你。我确实相信数据透视表 运行 虽然速度较慢(好吧,至少动态的是这样),所以只要你的问题没有改变就没问题。