简体   繁体   English

如何将 MS SQL T-SQL 转换为 MySQL 中的后续

[英]How can I convert MS SQL T-SQL into Subsequent in MySQL

Here I have a MS SQL query which I would like to convert into MySQL.这里我有一个 MS SQL 查询,我想将其转换为 MySQL。 I don't know how to deal with that.我不知道该怎么处理。

WITH PartitionData as (
  SELECT
    TOP 10 PurchaseDate.PurchaseDate AS date,
    BatchCode,
    ROW_NUMBER() OVER( PARTITION BY PurchaseDate.PurchaseDate ORDER BY ( SELECT NULL ) ) AS RowNumber

  FROM  tblNutBatches
  INNER JOIN PurchaseDate ON PurchaseDate.PurchaseDate BETWEEN tblNutBatches.Introduction_date AND tblNutBatches.expiration_date 
  WHERE  PurchaseDate.PurchaseDate = '2004-05-01'
   
)

SELECT
  date as date,
  [1],
  [2],
  [3],
  [4],
  [5],
  [6],
  [7],
  [8],
  [9]
FROM
  (
    SELECT
      date,
      BatchCode,
      RowNumber
    FROM
      PartitionData
  )AS  DataAfterFilter 
  
  PIVOT 
  (

    MAX(BatchCode) FOR RowNumber IN ([1], [2], [3], [4], [5], [6], [7], [8], [9])
  ) A

OUTPUT IN SQL SERVER

在此处输入图片说明

Any idea would be appreciated.任何想法将不胜感激。

You would typically use conditional aggregation:您通常会使用条件聚合:

SELECT date,
    MAX(CASE WHEN rn =  1 THEN BatchCode end) as BatchCode1,
    MAX(CASE WHEN rn =  2 THEN BatchCode end) as BatchCode2,
    ...
    MAX(CASE WHEN rn = 10 THEN BatchCode end) as BatchCode10
FROM (
    SELECT 
        pd.PurchaseDate AS date,
        BatchCode,
        ROW_NUMBER() OVER(PARTITION BY pd.PurchaseDate ORDER BY BatchCode) AS rn
    FROM  tblNutBatches nb
    INNER JOIN PurchaseDate pd ON pd.PurchaseDate BETWEEN nb.Introduction_date AND nb.expiration_date 
    WHERE  pd.PurchaseDate = '2004-05-01'
) t
WHERE rn <= 10
GROUP BY date

Notes:笔记:

  • if you want a consistent results, you need ORDER BY clauses in the subquery and in ROW_NUMBER() - I used BatchCode如果你想要一致的结果,你需要在子查询和ROW_NUMBER()使用ORDER BY子句 - 我使用了BatchCode

  • do prefix BatchCode with the alias of the table it belongs to用它所属的表的别名做前缀BatchCode

  • the PARTITION BY clause of ROW_NUMBER() and the outer GROUP BY clause are not necessary strictly speaking, since the subquery is filtering on just one data anyway;严格来说, ROW_NUMBER()PARTITION BY子句和外部的GROUP BY子句不是必需的,因为无论如何子查询只过滤一个数据; I retained them, in case you need to remove the filtering at some point.我保留了它们,以防您需要在某个时候删除过滤。 Accordingly, I moved the top 10 filtering logic form the subquery to the outer query.因此,我将前 10 个过滤逻辑从子查询移动到外部查询。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM