【问题标题】:SQL Server 2014 Join Doubling Line ItemsSQL Server 2014 加入双行项目
【发布时间】:2015-10-13 16:58:48
【问题描述】:

如果我足够努力地搜索,我通常可以找到问题的答案,但我不知道如何准确地表达我的问题以获得我想要的结果。

我遇到的问题是我正在尝试将我的订单费用表加入我的其他查询,以便查看是否应用了折扣或运费。

订单费用表中每个订单可能发生 3 种情况(应用折扣和运费)或(应用折扣)或(应用运费)

不允许使用空值,因此如果订单没有折扣或运费,则不会显示在此表中。

我没有应用订单费用的查询是:

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 表时的查询:

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 文件中,则此订单的成本、销售额和总数量字段现在都加倍,如果订单中有多个行项目,这将成为一个更大的问题。

我认为解决方案是将折扣和运费字段设为自己的列,但所做的只是将折扣和运费放在同一行,但所有订单项仍然加倍。

我必须仔细观察一些东西。

【问题讨论】:

  • 所以基本上,你想要的结果是 1 行中的 discountDescription、discountAmount、shippingDescription、 shipping Amount?
  • 没错,但我想不通。
  • 如果您确定在 OrderCharge 中只有运费和折扣条目,这并不难。如果有动态数字,那就很棘手了。

标签: sql sql-server join ssms sql-server-2014


【解决方案1】:
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 在 cmets 中指出的那样,这存在明显的问题。首先,有多个 Shipping 或 Discount 条目将重复行,此时您必须在 [Amount] 上使用总和(并且可能在描述上使用 XML 连接)。这也意味着每当出现新的 ChargeOrder 类型时,就必须更改查询。

理想的解决方案是使用 Pivot,但我还没有涉足这一点,所以我无法为您提供帮助。我确实相信数据透视表的运行速度较慢(嗯,至少动态的),所以只要你的问题没有改变,你应该没问题。

【讨论】:

  • 哇,这完全解决了我的问题。感谢您解释解决方案,而不仅仅是发布代码,非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多