none
"Only one expression can be specified in the select list when the subquery is not introduced with EXISTS. "hatası RRS feed

  • Soru

  • Merhaba,

    CREATE FUNCTION fx_Registration_Segment
    (
    @UserID VARCHAR(50),
    @CreatedDate DATE
    )
    RETURNS varchar(50)
    AS
    BEGIN

    DECLARE @Result varchar(50)
    SET @Result =
    (


    SELECT TOP (1000) [CustomerKey]
    ,CASE 
    WHEN [Created Date] = [OrderDate] THEN 'Register to buy'
    WHEN [Created Date]<>[OrderDate] THEN 'Register to look'
    ELSE 'Others'
            END AS 'Registration Segment'
    FROM [Mef_Sample_Database2].[dbo].[Customers] AS C
     INNER JOIN
     [Mef_Sample_Database2].[dbo].[Orders] AS O
     ON O.[CustomerKey]=C.[UserID]
     )
     return @Result


    END
    GO

    "Only one expression can be specified in the select list when the subquery is not introduced with EXISTS. "hatasını alıyorum 

    13 Ocak 2019 Pazar 13:21

Yanıtlar

  • Hocanin illa scalar function olusturmani istediğinden emin misin? "Demek istiyorum" derken duruma gore oyle bir sonuc mu istiyorsun (scalar function'a uyuyor)? Senin kodundaki "select top 1000" ne istediğini gizliyor. Kodun girişindeki parametrelerin de ne ise yaradigi mechul. Anlattigina gore lazim olan parametre sadece OrderId, orada CustomerKey (@userId) garip olmuş (tablolar sanki Northwind benzeri bir veritabanindan).

    Eğer verdigin bir OrderId'e karsilik,  'Register to buy', 'Register to look' ya da 'Others' donmesini istiyorsan:

    CREATE FUNCTION fn_Registration_Segment
    (
        @orderId INT
    )
    RETURNS VARCHAR(100)
    AS
    BEGIN
        DECLARE @result VARCHAR(100);
        SELECT @result = CASE
                             WHEN c.[Created Date] = o.OrderDate THEN
                                 'Register to buy'
                             WHEN c.[Created Date] <> o.OrderDate THEN
                                 'Register to look'
                             ELSE
                                 'Others'
                         END
        FROM Customers c
            INNER JOIN Orders o
                ON c.UserID = o.CustomerKey
        WHERE o.OrderId = @orderId;
        RETURN @result;
    END;
    

    Burada ELSE kismi çok gereksiz (oraya nasıl ulaşılacak fikrim yok - normalde 'Register to look' zaten ELSE kismini olusturuyor). Bir de, bu gercekten Northwind ornek veritabanı ise keske alan adları boyle dejenere edilmesiymiş, yeniden adlandırma kotu olmuş.

    • Yanıt Olarak İşaretleyen Mama miaa 14 Ocak 2019 Pazartesi 15:10
    14 Ocak 2019 Pazartesi 10:16

Tüm Yanıtlar

  • @result varchar(50) ama sen bir dataset döndürmeye calisiyorsun. Ne yapmaya calistigini anlamadigim icin alternatif oneremiyorum. 
    13 Ocak 2019 Pazar 13:25
  • Yapmak istediğim şu created date customer tablosunda order date order tablosunda, created date order date'e eşitse register to buy , eşit değil ve  Sales amount (yine order tablosundaki) 0 ise 'Register to look' fonksiyonunu çalıştırmaya çalışıyorum fakat ne yaptığımı ben de bilmiyorum :(((((((((((( 

     
    13 Ocak 2019 Pazar 13:37
  • Gercekten ne dediğin anlasilmiyor :(
    13 Ocak 2019 Pazar 14:14
  • Gercekten ne dediğin anlasilmiyor :(
    Bir dersimin final projesi için hocam segmenter oluşturmamı istedi. Bu segmentte yapmak istediğim Cutomer tablosundaki 'created date" ile order tablosundaki 'order date' aynı gün ise 'register to buy' aynı gün değil ve order tablosundaki 'sales amount' 0 ise 'register to look', kalanlara 'others' demek istiyorum. Fakat hocam veriler farklı tablolarda oluğu için scalar function oluşturmam gerektiğini söyledi. Function yazmayı tam öğrenemediğim için örneklerden yapabildiğim bu oldu. Nasıl yazabileceğim konusunda bana yardımcı olabilir misiniz?
    13 Ocak 2019 Pazar 19:15
  • Varchar (50) tipinde bir değişkenin içerisine table tipinde veri yolluyorsunuz . Aldığınız hata birden fazla dönen sonuç olduğunu söylüyor.Top (1) olarak denersen tek kayıt üzerinde geri dönüş sağlarsın ve hata almazsın . Ya da sorgunu Table Tipinde bir değişken kullanarak return edersin ve istediğin kadar kayıt döndürürsün.


    Altan Özdemir

    14 Ocak 2019 Pazartesi 06:26
  • Hocanin illa scalar function olusturmani istediğinden emin misin? "Demek istiyorum" derken duruma gore oyle bir sonuc mu istiyorsun (scalar function'a uyuyor)? Senin kodundaki "select top 1000" ne istediğini gizliyor. Kodun girişindeki parametrelerin de ne ise yaradigi mechul. Anlattigina gore lazim olan parametre sadece OrderId, orada CustomerKey (@userId) garip olmuş (tablolar sanki Northwind benzeri bir veritabanindan).

    Eğer verdigin bir OrderId'e karsilik,  'Register to buy', 'Register to look' ya da 'Others' donmesini istiyorsan:

    CREATE FUNCTION fn_Registration_Segment
    (
        @orderId INT
    )
    RETURNS VARCHAR(100)
    AS
    BEGIN
        DECLARE @result VARCHAR(100);
        SELECT @result = CASE
                             WHEN c.[Created Date] = o.OrderDate THEN
                                 'Register to buy'
                             WHEN c.[Created Date] <> o.OrderDate THEN
                                 'Register to look'
                             ELSE
                                 'Others'
                         END
        FROM Customers c
            INNER JOIN Orders o
                ON c.UserID = o.CustomerKey
        WHERE o.OrderId = @orderId;
        RETURN @result;
    END;
    

    Burada ELSE kismi çok gereksiz (oraya nasıl ulaşılacak fikrim yok - normalde 'Register to look' zaten ELSE kismini olusturuyor). Bir de, bu gercekten Northwind ornek veritabanı ise keske alan adları boyle dejenere edilmesiymiş, yeniden adlandırma kotu olmuş.

    • Yanıt Olarak İşaretleyen Mama miaa 14 Ocak 2019 Pazartesi 15:10
    14 Ocak 2019 Pazartesi 10:16
  • Hocanin illa scalar function olusturmani istediğinden emin misin? "Demek istiyorum" derken duruma gore oyle bir sonuc mu istiyorsun (scalar function'a uyuyor)? Senin kodundaki "select top 1000" ne istediğini gizliyor. Kodun girişindeki parametrelerin de ne ise yaradigi mechul. Anlattigina gore lazim olan parametre sadece OrderId, orada CustomerKey (@userId) garip olmuş (tablolar sanki Northwind benzeri bir veritabanindan).

    Eğer verdigin bir OrderId'e karsilik,  'Register to buy', 'Register to look' ya da 'Others' donmesini istiyorsan:

    CREATE FUNCTION fn_Registration_Segment
    (
        @orderId INT
    )
    RETURNS VARCHAR(100)
    AS
    BEGIN
        DECLARE @result VARCHAR(100);
        SELECT @result = CASE
                             WHEN c.[Created Date] = o.OrderDate THEN
                                 'Register to buy'
                             WHEN c.[Created Date] <> o.OrderDate THEN
                                 'Register to look'
                             ELSE
                                 'Others'
                         END
        FROM Customers c
            INNER JOIN Orders o
                ON c.UserID = o.CustomerKey
        WHERE o.OrderId = @orderId;
        RETURN @result;
    END;
    

    Burada ELSE kismi çok gereksiz (oraya nasıl ulaşılacak fikrim yok - normalde 'Register to look' zaten ELSE kismini olusturuyor). Bir de, bu gercekten Northwind ornek veritabanı ise keske alan adları boyle dejenere edilmesiymiş, yeniden adlandırma kotu olmuş.

    Bu şekilde çalıştırabildim. Teşekkür ederim...
    14 Ocak 2019 Pazartesi 15:11