2012-09-12 47 views
1
 
ID ProductId MemberId SessionId  CreatedOn Quantity 
62 1   2       2012-09-11 1 
63 2   2       2012-09-11 1 
64 1   0 agzdeoqubwokfme05wwmne55 2012-09-11 1 
65 3   0 agzdeoqubwokfme05wwmne55 2012-09-11 1 

我有上表,我需要做一個程序。 我的場景是沒有登錄添加項目到購物車,當你登錄合併所有項目。SQL更新查詢產品增加到購物車

我會通過在程序@MemberId(登錄會員ID)兩個參數,@SessionID

而且我要出去放表像下面。

 
ID ProductId MemberId SessionId  CreatedOn Quantity 
62 1   2       2012-09-11 2 
63 2   2       2012-09-11 1 
65 3   2        2012-09-11 1 

一個產品融合了其他產品,使數量2,而此行應該消失。

+1

哪個版本的SQL SERVER? –

回答

1
SELECT ProductID, 
     max(MemberId), 
     max(CreatedOn), 
     sum(Quantity) 
FROM theTable 
WHERE SessionID=<id> or MemberID=<id> 
GROUP BY ProductID 
+0

你的回答對我來說是完美的,但我需要一點幫助,我該如何更新這個表格呢?成員Id列最後記錄爲黑色。 –

2

假設SQL Server 2005或以上

CREATE TABLE #T (ID INT , ProductId INT, MemberId INT, SessionId VARCHAR(100), CreatedOn DATETIME, Quantity INT) 
INSERT INTO #T SELECT 62,1 ,2 ,' ','2012-09-11',1 
INSERT INTO #T SELECT 63, 2,2, ' ','2012-09-11',1 
INSERT INTO #T SELECT 64, 1,0,'agzdeoqubwokfme05wwmne55','2012-09-11',1 
INSERT INTO #T SELECT 65, 3,0,'agzdeoqubwokfme05wwmne55','2012-09-11',1 

;With CTE AS 
(SELECT 
    ID 
    ,ProductId 
    ,MemberId = MAX(MemberId) OVER(PARTITION BY ProductID ORDER bY(SELECT 1)) 
    ,SessionID 
    ,CreatedOn = CONVERT(VARCHAR(10),MAX(CreatedOn) OVER(PARTITION BY ProductID ORDER bY(SELECT 1)),20) 
    ,Quantity = SUM(Quantity) OVER(PARTITION BY ProductID ORDER bY(SELECT 1)) 
    ,Rn = ROW_NUMBER() OVER(PARTITION BY ProductID ORDER bY(SELECT 1)) 
FROM #T) 

SELECT ID,ProductId,MemberId,SessionID,CreatedOn,Quantity FROM CTE WHERE Rn = 1 

DROP TABLE #T 

如果要更新表會給結果作爲

ID ProductId MemberId SessionID    CreatedOn Quantity 
62 1   2         2012-09-11 2 
63 2   2         2012-09-11 1 
65 3   0   agzdeoqubwokfme05wwmne55 2012-09-11 1 

最後,在這裏你去

UPDATE #T 
SET 
    #T.ID = c.ID 
    ,#T.ProductId =c.ProductId 
    ,#T.MemberId = c.MemberId 
    ,#T.SessionID = c.SessionID 
    ,#T.CreatedOn = c.CreatedOn 
    ,#T.Quantity = c.Quantity 
FROM #T 
INNER JOIN CTE c 
ON #T.ID = c.ID 
WHERE c.Rn = 1 

結果是

ID ProductId MemberId SessionId    CreatedOn Quantity 
62 1    2         2012-09-11 2 
63 2    2         2012-09-11 1 
64 1    0 agzdeoqubwokfme05wwmne5  2012-09-11 1 
65 3    0 agzdeoqubwokfme05wwmne55  2012-09-11 1 

完整的查詢是

;With CTE AS 
(SELECT 
    ID 
    ,ProductId 
    ,MemberId = MAX(MemberId) OVER(PARTITION BY ProductID ORDER bY(SELECT 1)) 
    ,SessionID 
    ,CreatedOn = CONVERT(VARCHAR(10),MAX(CreatedOn) OVER(PARTITION BY ProductID ORDER bY(SELECT 1)),20) 
    ,Quantity = SUM(Quantity) OVER(PARTITION BY ProductID ORDER bY(SELECT 1)) 
    ,Rn = ROW_NUMBER() OVER(PARTITION BY ProductID ORDER bY(SELECT 1)) 
FROM #T) 

UPDATE #T 
SET 
    #T.ID = c.ID 
    ,#T.ProductId =c.ProductId 
    ,#T.MemberId = c.MemberId 
    ,#T.SessionID = c.SessionID 
    ,#T.CreatedOn = CONVERT(VARCHAR(10),c.CreatedOn,20) 
    ,#T.Quantity = c.Quantity 
FROM #T 
INNER JOIN CTE c 
ON #T.ID = c.ID 
WHERE c.Rn = 1 

SELECT * FROM #T 

DROP TABLE #T 

對於SQL的任何版本

UPDATE #T 
SET 
    #T.ID = c.ID 
    ,#T.ProductId =c.ProductId 
    ,#T.MemberId = c.MemberId 
    ,#T.SessionID = c.SessionID 
    ,#T.CreatedOn = c.CreatedOn 
    ,#T.Quantity = c.Quantity 
FROM #T 
INNER JOIN (SELECT t.ID,t.ProductID,t.MemberId,t.SessionId,t.CreatedOn,x.Quantity 
      FROM #T t 
      JOIN (
        SELECT 
          ID = MIN(ID) 
          ,ProductID 
          ,MemberId = MAX(MemberId)  
          ,CreatedOn = MAX(CreatedOn) 
          ,Quantity = SUM(Quantity) 
        FROM #T 
        GROUP BY ProductID 
        )X 
      ON t.ID =X.ID) c 
ON #T.ID = c.ID 


SELECT * FROM #T 
DROP TABLE #T 
1

更新可能不是最佳的解決方案,它可能是更好的刪除所有記錄,插入新的。

無論如何,如果你想更新,然後刪除額外的東西,你需要做這樣的事情。

假設ID是這裏唯一的關鍵。這裏是完整的邏輯,仔細閱讀

DECLARE @Temp1 TABLE 
(
--datafields same AS your table 

) 

DECLARE @Temp2 TABLE 
(
--datafields same AS your table 
) 

INSERT INTO @Temp1 
SELECT ID, 
     ProductID, 
     MemberId, 
     SessionId, 
     CreatedOn, 
     Quantity 
FROM theTable 
WHERE SessionID= @SessionID or MemberID= @MemberID 

UPDATE a 
SET SessionID = @SessionID , MemberID= @MemberID 
FROM @Temp1 AS a 
--WHERE SessionID= @SessionID OR MemberID= @MemberID 

INSERT INTO @Temp2 
SELECT MAX(ID), 
     ProductID, 
     max(MemberId), 
     MAX(SessionId), 
     max(CreatedOn), 
     sum(Quantity) 
FROM @Temp1 
GROUP BY ProductID 

UPDATE a 
SET a.MemberId = b.MemberId ,a.SessionId=b.SessionId ,a.CreatedOn=b.CreatedOn,a.Quantity=b.Quantity 
FROM YourTable AS a 
INNER JOIN @Temp2 AS b 
ON a.ID=b.ID  

DELETE FROM YourTable 
WHERE ID IN (SELECT ID 
        FROM @Temp1 AS ta 
        WHERE NOT EXISTS (SELECT 1 
             FROM @Temp2 AS tb 
             WHERE ta.ID = tb.ID))