SQL Server中的访问逻辑

时间:2014-08-07 18:59:53

标签: sql sql-server ms-access-2007

我试图弄清楚Access中的语句是如何产生输出的 - 这样我就可以在SQL Server中编写它 - 但是我不熟悉“IIF”功能但是我在服务器中听说过你会使用案例功能。任何人都可以翻译下面的代码试图说的 - 查询的最终结果是几天(TRANSIT) - 我只是无法理解他们是如何通过这条查询到达那里的。从工厂代码到以某种方式产生运输时间似乎非常混乱。

IIf(plant_code = "6010", [6010], [6041]) AS TRANSIT,
aship_date + IIf(
   DatePart('w',aship_date) < IIf(plant_code = "6010", [6010], [6041]) * - 1 + 7,
   IIf(plant_code = "6010", [6010], [6041]),
   IIf(plant_code = "6010", [6010], [6041]) + 2
      - Round(DatePart('w', aship_date) / 13, 0)
) AS ESTIMATED_DELIVERY_DATE

***感谢所有反馈,转换这些Access查询可能会令人困惑。我发布了它看起来如何(整个代码),如果我格式化它 - 我真的有一些业务问题我需要要求澄清,因为“IIF”的使用是如此普遍,如果它等于CASE然后这是奇怪的。 6010,6040(似乎缺少),6041是物理工厂,而不是列 - 它们属于“plant_code”列,所以我认为这可能是我可以在服务器上创建一个代表我需要根据工厂比较运输的价值(这也可以在需要时改变)。此外,表“t”是仅在Access中创建的临时表,并且大部分数据已过期。我认为最好的方法是删除JOIN并查看我可以在哪里删除IIF语句,并根据第二个更可靠的传输表获得条件。我非常感谢大家的帮助,这非常有用。完整代码(正如我在SQL Server中暂时规定的那样 - 原始表“O”是通过实际服务器上的UNION ALL复合而来的):

SELECT t.DM, 
       t.AREA,
       t.STORE, 
       t.STORE_NAME, 
       "(" & T.STORE & ") " & T.STORE_NAME AS LOCATION, 
       O.WHSE, O.PO_NUMBER, 
       O.SHIPPED_UNITS, 
       O.CARTON_COUNT, 
       O.ASHIP_DATE AS ACTUAL_SHIP_DATE, 
       IIf(plant_code ='6010',[6010],[6041]) AS TRANSIT, 
       aship_date+IIf(DatePart('w',aship_date)<IIf(plant_code="6010",[6010],[6041])*-1+7,
       IIf(plant_code="6010",[6010],[6041]),IIf(plant_code="6010",[6010],[6041])+2-Round(DatePart          ('w',aship_date)/13,0)) AS ESTIMATED_DELIVERY_DATE, 
       O.CARRIER, 
       MAX(O.TrackingNo) AS TRACKING_NUMBER, 
       O.DeliveryStatus AS STATUS, 
       O.DeliveryDate AS DELIVERY_DATE
FROM VW_ADIDAS_RETAIL_aRI
UNION ALL VW_ADIDAS_RETAIL_aRO O
JOIN  tstores AS t
WHERE (((O.SHIP_TO)=[t].[DC_ACCT]) 
AND  O.process_date >= GETDATE()-60 
AND  O.order_status IN ('SHP','90')
AND  O.DeliveryDate IS NULL
GROUP BY t.DM, 
         t.AREA, 
         t.STORE, 
         t.STORE_NAME, 
         O.WHSE, 
         O.PO_NUMBER, 
         O.SHIPPED_UNITS, 
         O.CARTON_COUNT, 
         O.ASHIP_DATE, 
         IIf(plant_code="6010",[6010],[6041]), 
         O.CARRIER, 
         O.DeliveryStatus, 
         O.DeliveryDate;

2 个答案:

答案 0 :(得分:1)

除非我误解,[6010]和[6041]是表格中的列。 plant_code也可能是6010的事实增加了混乱。 对于第一个(更简单的一个),它表示如果plant_code是6010,则使用6010列中的值,否则使用6041列。 (我将其称为下面的公交号码)

对于第二个,如果aship_date的星期几小于Transit号码 - 1 + 7,则取aship_date和上面的值,否则取转码+2 - 最接近星期几的整数aship_date / 13.哪个btw,除非它的星期六应该是0,如果它是星期六然后减1。

如果我知道数字列的实际内容以帮助真正描述它,它会有所帮助。

答案 1 :(得分:1)

立即转换

CASE WHEN plant_code="6010" THEN [6010] ELSE [6041] END AS TRANSIT, 
aship_date + CASE WHEN 
        DatePart(WEEKDAY,aship_date) < 7 - CASE WHEN plant_code="6010" THEN [6010] ELSE [6041] END
          THEN 
              CASE WHEN plant_code="6010" THEN [6010] ELSE [6041] END  
          ELSE  
              CASE WHEN plant_code="6010" THEN [6010] ELSE [6041] END + 2 - ROUND(DatePart(WEEKDAY,aship_date)/13,0) 
          END AS ESTIMATED_DELIVERY_DATE

但在这种情况下,使用CROSS APPLY

会更简单,更易读
SELECT 
    TRANSIT, 
    aship_date + case when DatePart(WEEKDAY,aship_date) < 7 - TRANSIT
                    THEN TRANSIT
                    ELSE TRANSIT + 2 - ROUND(DatePart(WEEKDAY,aship_date)/13.0,0) 
                 END AS ESTIMATED_DELIVERY_DATE
FROM <TABLE>
CROSS APPLY (SELECT CASE WHEN plant_code="6010" THEN [6010] ELSE [6041] END) N(TRANSIT)

单词代码

要理解代码,请记住,plant_code将定义哪个列将成为传输值 - 6010或6041.

计算调整后的过境天数

如果星期几加上过境是与周日不同的一天,那么将需要过境天数。否则,它将需要过境+ 2 - 装运日期的星期几除以13(它将仅为星期日一个。)

换句话说,如果使用常规运输天数的估计交货日期与周日不同,则使用传统的运输天数。否则,如果发货日期是星期日,则使用transit + 1否则使用transit + 2

要获得预计的交货日期,他们会将发货日期的工作日加上上面计算的调整后的运输量。

代码

ROUND(DatePart(WEEKDAY,aship_date)/13,0)

相同
CASE WHEN DatePart(WEEKDAY,aship_date) = 7 THEN 1 ELSE 0 END

我要感谢@ErikE,他提供了这个SQL Fiddle