ورود

View Full Version : جمع و آنالیز ستونها



modern_amin
سه شنبه 10 اردیبهشت 1392, 16:05 عصر
باسلام
من QUERY نویسی SQL لم زیاد خوب نیست
به یک مشکلی خوردم که خیلی مهمه و باید حلش کنم ولی نمیدونم چطوری....
>>>خدایا چطوری حالا توضیح بدم<<<

فرض کنید جدول من 9 ستون زیر که همگی از نوع Nvarchar هستن رو داره (((البته خیلی بیشتر داره)))
C3 | C2 | C1 | B3 | B2 | B1 | A3 | A2 | A1

من میخام 3 تا ستون مجازی با نامهای Z1 , Z2 , Z3 بگیرم
C3 | C2 | C1 | B3 | B2 | B1 | A3 | A2 | A1 | Z1 | Z2 | Z3
خب تا اینجا مشکلی نیست حالا میخام تو ستونهای مجازیم یکسری آنالیز ستونهای واقعی (همون 9 ستون) رو انجام بدم
محاسبم چیه: محاسبم اینه میخام بیاد حساب کنه اگر جمع ستونهای A (اعم از A1,A2,A3 ) برابر 3 بود به ستون مجازی Z3 یکی اضافه بشه و اگر جمعش سه ستون A برابر با 2 بود به ستون Z2 یکی اضافه بشه و اگر 1 بود به ستون Z1 یکی اضافه بشه و مجدد اگر جمع ستونهای B (اعم از B1 , B2 , B3 ) برابر با 3 باشه به ستون مجازی Z3 دوباره یکی دیگه هم اضافه کنه و یا اگر 2 بود به Z2 اضافه کنه و اگر 1 بود به Z1 و همچنین همین مراحل برای خانه های C ( اعم از C1 , C2 , C3)
درواقع جمع ستونهای A و B و C بصورت جدا حساب بشه بعد اگر جمع هرکدام از سه ستون A و سه ستون C برابر با 3 باشه و جمع سه ستون B برابر با 2 باشد باید ستون مجازی به اینصورت باشه Z1=0 , Z2=1 , Z3=2 بشه

سه تا مثال:
اگر مقدار ستونها برابر با
C3=1 | C2=0 | C1=0 | B3=1 | B2=0 | B1=1 | A3=1 | A2=1 | A1=1
بنابراین Z1=1 Z2=1 Z3=1

اگر مقدار ستونها برابر با
C3=1 | C2=1 | C1=0 | B3=1 | B2=1 | B1=1 | A3=1 | A2=1 | A1=1
بنابراین Z1=0 Z2=1 Z3=2

اگر مقدار ستونها برابر با
C3=1 | C2=0 | C1=0 | B3=1 | B2=0 | B1=0 | A3=0 | A2=0 | A1=1
بنابراین Z1=3 Z2=0 Z3=0

modern_amin
چهارشنبه 11 اردیبهشت 1392, 09:22 صبح
دوستان لطفا کمک کنید.....

Mahmoud.Afrad
چهارشنبه 11 اردیبهشت 1392, 18:00 عصر
یک تابع Scalar valued بنویس محاسباتو انجام بده و نتیجه رو به صورت رشته برگردون:

CREATE FUNCTION [dbo].[Func_GetZ1Z2Z3]
(
@strA1 VARCHAR,
@strA2 VARCHAR,
@strA3 VARCHAR,
@strB1 VARCHAR,
@strB2 VARCHAR,
@strB3 VARCHAR,
@strC1 VARCHAR,
@strC2 VARCHAR,
@strC3 VARCHAR
)
RETURNS VARCHAR(MAX)
AS
BEGIN
DECLARE @aTotal int, @bTotal int, @cTotal int ;
DECLARE @t1 int = 0, @t2 int = 0, @t3 int = 0;
DECLARE @A1 int, @A2 int, @A3 int, @B1 int, @B2 int, @B3 int, @C1 int, @C2 int, @C3 int
SET @A1 = CAST(@strA1 as int) ;
SET @A2 = CAST(@strA2 as int) ;
SET @A3 = CAST(@strA3 as int) ;
SET @B1 = CAST(@strB1 as int) ;
SET @B2 = CAST(@strB2 as int) ;
SET @B3 = CAST(@strB3 as int) ;
SET @C1 = CAST(@strC1 as int) ;
SET @C2 = CAST(@strC2 as int) ;
SET @C3 = CAST(@strC3 as int) ;

SET @aTotal = @a1+@a2+@a3 ;
SET @bTotal = @b1+@b2+@b3 ;
SET @cTotal = @c1+@c2+@c3 ;

IF (@aTotal = 1)
SET @t1 = @t1 + 1 ;
ELSE IF (@aTotal = 2)
SET @t2 = @t2 + 1 ;
ELSE IF (@aTotal = 3)
SET @t3 = @t3 + 1 ;

IF (@bTotal = 1)
SET @t1 = @t1 + 1 ;
ELSE IF (@bTotal = 2)
SET @t2 = @t2 + 1 ;
ELSE IF (@bTotal = 3)
SET @t3 = @t3 + 1 ;

IF (@cTotal = 1)
SET @t1 = @t1 + 1 ;
ELSE IF (@cTotal = 2)
SET @t2 = @t2 + 1 ;
ELSE IF (@cTotal = 3)
SET @t3 = @t3 + 1 ;

RETURN CAST(@t1 AS VARCHAR) + ',' + CAST(@t2 AS VARCHAR) + ',' + CAST(@t3 AS VARCHAR) ;

END


حالا موقع سلکت تابع رو فراخوانی کن و بعد با SUBSTRING نتیاج رو جدا کن:

WITH cte
AS
(
SELECT A1, A2, A3, B1, B2, B3, C1, C2, C3,
dbo.Func_GetZ1Z2Z3(A1, A2, A3, B1, B2, B3, C1, C2, C3) as ZZZ
FROM Table_1
)
select A1, A2, A3, B1, B2, B3, C1, C2, C3,
SUBSTRING(ZZZ , 1 , 1) AS Z1,
SUBSTRING(ZZZ , 3 , 1) AS Z2,
SUBSTRING(ZZZ , 5 , 1) AS Z3
FROM cte

modern_amin
چهارشنبه 11 اردیبهشت 1392, 19:56 عصر
ممنون بابت پاسخ واقعا زحمتتون شد

میشه مختصر درمورد Scalar valued توضیح بدید
کل این دستورات بالا و پائین رو یکجا تو commandtext بنویسم و بعد به sql بفرستم تا جواب بگیرم؟؟؟

Mahmoud.Afrad
چهارشنبه 11 اردیبهشت 1392, 22:25 عصر
توی دیتابیس روی Function راست کلیک و یک scalar valued function اضافه کنید و کد اولو داخلش کپی و سیو کنید.
قسمت دوم هم دستور سلکت هست که میتونید در قالب یک StoredProcedure بنویسید و در برنامه ازش استفاده کنید.

modern_amin
شنبه 14 اردیبهشت 1392, 11:15 صبح
من یک scalar-valued function ساختم و توی یک مسیری ذخیره کردم (الته تو لیستش نشون نمیده)


http://barnamenevis.org/attachment.php?attachmentid=103672&d=1367651637

cherchil_hra
یک شنبه 15 اردیبهشت 1392, 07:33 صبح
بدون استفاده از تابع، از این روش هم می توانید استفاده کنید:


;with conv (a1, a2, a3, b1, b2, b3, c1, c2, c3)
as (
SELECT CAST(a1 AS INT),CAST(a2 AS INT),CAST(a3 AS INT),
CAST(b1 AS INT),CAST(b2 AS INT),CAST(b3 AS INT),
CAST(c1 AS INT),CAST(c2 AS INT),CAST(c3 AS INT)
FROM Table_1
)
SELECT *,
CASE WHEN (a1 + a2 + a3) = 1 THEN 1 else 0 END +
CASE WHEN (b1 + b2 + b3) = 1 THEN 1 else 0 END +
CASE WHEN (c1 + c2 + c3) = 1 THEN 1 else 0 END AS z1,

CASE WHEN (a1 + a2 + a3) = 2 THEN 1 else 0 END +
CASE WHEN (b1 + b2 + b3) = 2 THEN 1 else 0 END +
CASE WHEN (c1 + c2 + c3) = 2 THEN 1 else 0 END AS z2,

CASE WHEN (a1 + a2 + a3) = 3 THEN 1 else 0 END +
CASE WHEN (b1 + b2 + b3) = 3 THEN 1 else 0 END +
CASE WHEN (c1 + c2 + c3) = 3 THEN 1 else 0 END AS z3
FROM conv


یا موقعی که داری ستون ها رو تبدیل به int می کنی ستون ها رو با هم جمع بزنی => a,b,c
و در نهایت این سه ستون رو مقایسه کنی

modern_amin
یک شنبه 15 اردیبهشت 1392, 08:35 صبح
ممنون بابت پاسخ

ولی این کوثری جواب درست رو بر نمیگردونه

هر مرحله باید با قبل جممع بشه
اگر سه ستون A برابر با یک باشه و سه ستون B برابر با یک باشه و سه ستون C برابر با یک باشه ستون z1 باید برابر با 3 باشه ننننه یک


http://barnamenevis.org/attachment.php?attachmentid=103718

modern_amin
یک شنبه 15 اردیبهشت 1392, 09:20 صبح
یه ذره به مغزم فشار آوردم و اینو نوشتم جواب داد
ممنون از همه


SELECT * ,
CASE WHEN (CAST( A1 AS int) + CAST( A2 AS int) + CAST( A3 AS int)) = 1 THEN 1 else 0 END +
CASE WHEN (CAST( B1 AS int) + CAST( B2 AS int) + CAST( B3 AS int)) = 1 THEN 1 else 0 END +
CASE WHEN (CAST( C1 AS int) + CAST( C2 AS int) + CAST( C3 AS int)) = 1 THEN 1 else 0 END
AS z1,

CASE WHEN (CAST( A1 AS int) + CAST( A2 AS int) + CAST( A3 AS int)) = 2 THEN 1 else 0 END +
CASE WHEN (CAST( B1 AS int) + CAST( B2 AS int) + CAST( B3 AS int)) = 2 THEN 1 else 0 END +
CASE WHEN (CAST( C1 AS int) + CAST( C2 AS int) + CAST( C3 AS int)) = 2 THEN 1 else 0 END
AS z2,

CASE WHEN (CAST( A1 AS int) + CAST( A2 AS int) + CAST( A3 AS int)) = 3 THEN 1 else 0 END +
CASE WHEN (CAST( B1 AS int) + CAST( B2 AS int) + CAST( B3 AS int)) = 3 THEN 1 else 0 END +
CASE WHEN (CAST( C1 AS int) + CAST( C2 AS int) + CAST( C3 AS int)) = 3 THEN 1 else 0 END
AS z3
FROM Table_1

cherchil_hra
یک شنبه 15 اردیبهشت 1392, 13:07 عصر
اونجوری که نوشتم بخاطر این هست که نخوای برای هر مرحله عمل تبدیل داشته باشی

من جای جدول a باید می نوشتم جدول conv که اصلاح شد. در واقع باید بهت error میداده، چون شما جدول a نداشتی