分组更新和拥有

时间:2014-01-02 09:54:03

标签: sql sql-server-2005

我正在尝试更新SQL Server中的某些列,但我发现有一些GROUP BYhaving条件。我已经使用了一些线索,这些线索在这里写了一些答案,但我无法解决它。有人可以帮我找一下我的SQL命令在哪里做错了吗?

感谢您的回答!

这就是我想要做的事情如果它适用于GROUP BY。

UPDATE T SET T.TES_TARIHI = G.TARIH FROM TESLIM_FORMU T
INNER JOIN GONDERI_HAREKET G ON T.TAKIP_NO = G.TAKIP_NO
INNER JOIN GONDERI_HAREKET G2 ON T.TAKIP_NO = G2.TAKIP_NO
WHERE T.MUSTERI_KODU = 2483 AND YEAR(T.CIKIS_TARIHI) = 2012 AND G.ISLEM_KODU = 15 AND G2.ISLEM_KODU IN (40,41,42,43,44,45,46,47,48,49,78) AND T.DURUMU = 1 AND T.ISLEM_KODU <> 77
GROUP BY T.TAKIP_NO, T.CIKIS_TARIHI, T.TES_TARIHI
HAVING (DATEDIFF(dd,MAX(G.TARIH), T.TES_TARIHI) >= 1)

我将代码更改为:

UPDATE T
SET T.TES_TARIHI = X.(MAX(TARIH))
FROM TESLIM_FORMU T
INNER JOIN
  (SELECT TAKIP_NO, ISLEM_KODU, (TARIH)
   FROM GONDERI_HAREKET
   WHERE T.MUSTERI_KODU = 2483
     AND YEAR(T.CIKIS_TARIHI) = 2012
     AND G.ISLEM_KODU = 15
     AND T.DURUMU = 1
     AND T.ISLEM_KODU <> 77
   GROUP BY T.TAKIP_NO,
            T.CIKIS_TARIHI,
            T.TES_TARIHI HAVING (DATEDIFF(dd,MAX(G.TARIH), T.TES_TARIHI) >= 1)) X ON X.TAKIP_NO = T.TAKIP_NO

我收到错误:

  

Msg 4104,Level 16,State 1,Line 1
  无法绑定多部分标识符“T.MUSTERI_KODU”。

原始代码:

SELECT T.TAKIP_NO AS 'TAKİP NO',
       T.CIKIS_TARIHI AS 'ÇIKIŞ TARİHİ' ,
       T.TES_TARIHI AS 'TESLİM TARİHİ',
       MAX(G2.TARIH) AS 'GONDERİ HAREKET TESLİM TARİHİ',
       MAX(G.TARIH) AS 'KURYEDE TARİHİ',
       DATEDIFF(dd,MAX(G.TARIH), T.TES_TARIHI) AS 'GÜN'
FROM TESLIM_FORMU T
INNER JOIN GONDERI_HAREKET G ON T.TAKIP_NO = G.TAKIP_NO
INNER JOIN GONDERI_HAREKET G2 ON T.TAKIP_NO = G2.TAKIP_NO
WHERE T.MUSTERI_KODU = 2483
  AND YEAR(T.CIKIS_TARIHI) = 2012
  AND G.ISLEM_KODU = 15
  AND G2.ISLEM_KODU IN (40,
                        41,
                        42,
                        43,
                        44,
                        45,
                        46,
                        47,
                        48,
                        49,
                        78)
  AND T.DURUMU = 1
  AND T.ISLEM_KODU <> 77
GROUP BY T.TAKIP_NO,
         T.CIKIS_TARIHI,
         T.TES_TARIHI HAVING (DATEDIFF(dd,MAX(G.TARIH), T.TES_TARIHI) >= 1)
ORDER BY DATEDIFF(dd,MAX(G.TARIH), T.TES_TARIHI)

1 个答案:

答案 0 :(得分:0)

我对Vland的回答及其完成做了一些改变!

UPDATE T
SET T.TES_TARIHI = X.TARIH
FROM TESLIM_FORMU T
INNER JOIN
  (SELECT T.TAKIP_NO, G.ISLEM_KODU, MAX(G.TARIH) AS TARIH
   FROM GONDERI_HAREKET G
   INNER JOIN TESLIM_FORMU T ON T.TAKIP_NO = G.TAKIP_NO
   INNER JOIN GONDERI_HAREKET G2 ON T.TAKIP_NO = G2.TAKIP_NO
   WHERE T.MUSTERI_KODU = 2483
     AND YEAR(T.CIKIS_TARIHI) = 2013
     AND G.ISLEM_KODU = 15
     AND T.DURUMU = 1
     AND T.ISLEM_KODU <> 77
     AND G2.ISLEM_KODU IN (40,41,42,43,44,45,46,47,48,49,78)
   GROUP BY T.TAKIP_NO,
            T.CIKIS_TARIHI,
            T.TES_TARIHI, 
            G.ISLEM_KODU
HAVING (DATEDIFF(dd,MAX(G.TARIH), T.TES_TARIHI) >= 1)) X ON X.TAKIP_NO = T.TAKIP_NO

感谢您的帮助和患者弗拉德。