【问题标题】:TSQL add all data to first row then half the data afterTSQL将所有数据添加到第一行,然后将一半数据添加到之后
【发布时间】:2018-05-16 21:35:51
【问题描述】:

大家好,我有一个表,当我运行查询时,我得到如下信息:

ID |The GUID                 |Quantity |Maint Part Number |Ship Group    |Date Received
-----------------------------------------------------------------------------------------
2  |54219-8974-8702-852-5425 |50       |54VRT             |ShipG105      |06/08/2018
3  |68v3f-5kjd-46ee-586-5988 |10       |M6eR5w            |ShipG001      |10/19/2010
4  |ErR20-bvmd-0001-bGT-0O0O |100      |MRE101            |ShipG99       |01/01/2011

现在我想做的是:

ID |The GUID                 |Quantity |Maint Part Number |Ship Group    |Date Received
-----------------------------------------------------------------------------------------
2  |54219-8974-8702-852-5425 |50       |54VRT             |ShipG105      |06/08/2018
3  |                         |         |M6eR5w            |ShipG001      |10/19/2010
4  |                         |         |MRE101            |ShipG99       |01/01/2011

所有数据都出现在这第一条记录行中,而后面的行只有 inv_... 的附加数据。

我从 multipole INNER JOIN 表和 LEFT JOIN 表中获取所有这些数据。

查询示例:

SELECT
   BL.ID                AS 'ID',
   BL.guid              AS 'The GUID',
   BL.qty               AS 'Quantity',
   I.inv_maintPartNum   AS 'Maint Part Number',
   I.inv_ShipGrp        AS 'Ship Group',
   I.inv_DateRec        AS 'Date Received' 
FROM 
   BizLine              AS BL 
INNER JOIN inventory    AS I 
   ON BL.ID = I.ID
..........

我该怎么做?

更新

如果我有更多具有不同 ID 的记录,如下所示:

ID |The GUID                 |Quantity |Maint Part Number |Ship Group    |Date Received
-----------------------------------------------------------------------------------------
2  |54219-8974-8702-852-5425 |50       |54VRT             |ShipG105      |06/08/2018
2  |68v3f-5kjd-46ee-586-5988 |10       |M6eR5w            |ShipG001      |10/19/2010
2  |ErR20-bvmd-0001-bGT-0O0O |100      |MRE101            |ShipG99       |01/01/2011
3  |68rGw-3567-0001-123-fG34 |5        |GRD2859           |ShipG1        |11/11/2012
3  |5879R-376T-FDSW-RT7-23FG |1005     |Sv22              |ShipG87       |04/19/2017

现在使用来自@SQLChao 的查询看起来像这样:

2  |54219-8974-8702-852-5425 |50       |54VRT             |ShipG105      |06/08/2018
2  |                         |         |M6eR5w            |ShipG001      |10/19/2010
2  |                         |         |MRE101            |ShipG99       |01/01/2011
3  |                         |         |GRD2859           |ShipG1        |11/11/2012
3  |                         |         |Sv22              |ShipG87       |04/19/2017

现在应该是这样的:

2  |54219-8974-8702-852-5425 |50       |54VRT             |ShipG105      |06/08/2018
2  |                         |         |M6eR5w            |ShipG001      |10/19/2010
2  |                         |         |MRE101            |ShipG99       |01/01/2011
3  |68rGw-3567-0001-123-fG34 |5        |GRD2859           |ShipG1        |11/11/2012
3  |                         |         |Sv22              |ShipG87       |04/19/2017

注意 ID 3 如何像第一个 ID 2 一样从所有数据开始,然后只显示其他数据。

【问题讨论】:

    标签: sql tsql sql-server-2016


    【解决方案1】:

    您可以使用ROW_NUMBER(),如果它 = 1,则返回数据。否则留空。我不太确定您是如何订购数据的,所以我使用了BL.ID。如果需要,您可以将其更改为其他内容。

    SELECT
       BL.ID                AS 'ID',
       CASE WHEN ROW_NUMBER() OVER (PARTITION BY BL.ID ORDER BY BL.ID ASC) = 1 THEN BL.guid ELSE '' END AS 'The GUID',
       CASE WHEN ROW_NUMBER() OVER (PARTITION By BL.ID ORDER BY BL.ID ASC) = 1 THEN BL.qty ELSE '' END AS 'Quantity',
       I.inv_maintPartNum   AS 'Maint Part Number',
       I.inv_ShipGrp        AS 'Ship Group',
       I.inv_DateRec        AS 'Date Received' 
    FROM 
       BizLine              AS BL 
    INNER JOIN inventory    AS I 
       ON BL.ID = I.ID
    ..........
    

    【讨论】:

    • 不错的代码@SQLChao,它确实有效,但我忘了补充一点,如果它是一个新 ID,我需要它来做同样的事情。有关此更新示例,请参阅我的 OP。
    • @StealthRT 答案已更新。解决方法是一样的。添加了分区。您仍然需要在 id 集中选择如何排序。
    • 干得好,SQLChao!现在工作得很好。谢谢!
    • 是否可以将第一个 CASE 保存到一个变量中,这样我的查询对于 CASE 结构就不会那么大(它目前有 230 行用于查询)?
    • 我注意到如果该列是一个 INT 而不是在该单元格中放置一个 blank 它会放入 0.
    【解决方案2】:

    试试这个

    ;With myData as
    (
    SELECT
       BL.ID                AS 'ID',
       BL.guid              AS 'The GUID',
       BL.qty               AS 'Quantity',
       I.inv_maintPartNum   AS 'Maint Part Number',
       I.inv_ShipGrp        AS 'Ship Group',
       I.inv_DateRec        AS 'Date Received',
       ROW_NUMBER() Over (Partition By BL.ID Order By BL.ID) RowNo
    
    FROM 
       BizLine              AS BL 
    INNER JOIN inventory    AS I 
       ON BL.ID = I.ID
    
    )
    Select ID, IIF(RowNo = 1, [The GUID], ' ')  [The GUID], IIF(RowNo = 1, [Quantity], ' ') Quantity, [Maint Part Number], [Ship Group], [Date Received]
    From myData
    

    您可能需要修改窗口函数来识别您想要完整数据的记录。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-05
      • 2011-10-09
      • 1970-01-01
      • 1970-01-01
      • 2013-04-24
      相关资源
      最近更新 更多