2017-10-10 97 views
0

的組合,這是當前的SQL,我得到了如何計算兩個列

SELECT STUFF((SELECT ', ' + RTRIM(CAST(ShipmentCargoContainersSummary.units AS VARCHAR(20))) + ' X ' + 
     CAST(RTRIM(ContainerType.description) AS VARCHAR(20)) [text()] FROM ... 
     FOR XML PATH(''), TYPE).value('.','NVARCHAR(MAX)'),1,2,' ') fclVolume 
     FROM Shipment INNER JOIN .... 

輸出

enter image description here

我的問題是如何解決這個問題的代碼,這樣我可以算所有這些爲11行並得到像這樣的預期輸出:8 X 40Hc, 3 X 20GP

+0

@YogeshSharma感謝,並進行編輯後:) –

+1

@IntanNurShafienaz添加樣本數據(它是如何存儲在數據庫表) –

+0

這是沒有更優雅的解決將單元連接到描述的中間步驟。你的數據如何實際存儲在數據庫中? – iamdave

回答

0

假設你有如下數據:

2X40'HC 
1X40'HC 
1X40'HC 
1X20'GP 
1X40'HC 
1X40'HC 
1X40'HC 
1X20'GP 
1X40'HC 
1X40'HC 
1X20'GP 

你的,最終的結果是:

8 X 40Hc, 3 X 20GP 

如果一切都正確,那麼你可以嘗試以下SQL Command

;WITH CTE 
    AS (
    SELECT COUNT(CONVERT(INT, SUBSTRING(DATA, 3, 2))) DATA1, 
      SUBSTRING(DATA, 3, LEN(DATA)) DATA 
    FROM <tablename> 
    GROUP BY SUBSTRING(DATA, 3, LEN(DATA))) 
    SELECT [DATA] = STUFF(
          (
           SELECT ','+REPLACE(CONVERT(NVARCHAR(MAX), DATA1)+'X'+DATA, '''', '') 
           FROM CTE FOR XML PATH('') 
         ), 1, 1, ''); 

結果:

3X20GP,8X40HC 

希望上面的SQL命令能幫到你。

+0

沒有必要從數據中解析出所提供的數量,因爲這是前一個查詢具有可用值的結果以適當的格式。由於缺乏調查OP的實際情況和要求,請不要提供完全跳過良好做法的答案。 – iamdave

0

您可以使用此查詢(WITH部分只是用數據模擬原始表)。

在內部查詢中刪除所有空格並找到X的位置。

在下一個查詢(從內部開始)中,似乎提取了qty以及字符串的其餘部分(不包括X)。

在下一個查詢GROUP BY被做出(我把兩個假設,一個與SUM和一個與COUNT,但你可以消除一個對你沒有意思)。

外部查詢格式輸出,因爲它看起來你需要。

WITH X AS (SELECT '2 X 40''HC' AS VOLUME 
UNION ALL SELECT '1 X 40''HC' 
UNION ALL SELECT '1 X 40''HC' 
UNION ALL SELECT '12 X 20''GP' 
UNION ALL SELECT '1 X 40''HC' 
UNION ALL SELECT '1 X 40''HC' 
UNION ALL SELECT '1 X 40''HC' 
UNION ALL SELECT '1 X 20''GP' 
UNION ALL SELECT '1 X 40''HC' 
UNION ALL SELECT '1 X 40''HC' 
UNION ALL SELECT '1 X 20''GP') 

SELECT CAST (SUM_QTY AS VARCHAR(5))+' X ' +GRP AS ONE_CASE 
     ,CAST (NUM_QTY AS VARCHAR(5))+' X ' +GRP AS SECOND_CASE 
FROM (SELECT GRP, SUM(QTY) AS SUM_QTY, COUNT(*) AS NUM_QTY 
    FROM (
     SELECT CAST(LEFT(VOLUME,pos1-1) AS int) AS QTY, 
       SUBSTRING(VOLUME,pos1+1,LEN(VOLUME)) AS GRP 
     FROM (SELECT CHARINDEX('X',REPLACE(VOLUME,' ' , '')) pos1, REPLACE(VOLUME,' ' , '') AS VOLUME FROM X) A 
     ) B 
    GROUP BY GRP 
    ) C 

輸出:

ONE_CASE SECOND_CASE 
14 X 20'GP 3 X 20'GP 
9 X 40'HC 8 X 40'HC 
+0

沒有必要從數據中解析出所提供的數量,因爲這是前一個查詢的結果,該查詢具有適當格式的值。由於缺乏調查OP的實際情況和要求,請不要提供完全跳過良好做法的答案。 – iamdave