2012-06-26 16 views
16

मुझे एक एमएस एसक्यूएल 2012 क्वेरी बनाने में कुछ मदद की ज़रूरत है जो वांछित सीढ़ी-चरण आउटपुट से मेल खाएगा। पंक्तियों एक तिथि सीमा (खाता सबमिट करने का दिनांक माह) से डेटा का सारांश, और स्तंभों अन्य दिनांक सीमा से यह संक्षेप में प्रस्तुत (भुगतान तिथि महीने)एसक्यूएल सीढ़ी प्रश्न सहायता

तालिका 1: लेखा पटरियों संग्रह के लिए रखा खातों।

CREATE TABLE [dbo].[Accounts](
    [AccountID] [nchar](10) NOT NULL, 
    [SubmissionDate] [date] NOT NULL, 
    [Amount] [money] NOT NULL, 
CONSTRAINT [PK_Accounts] PRIMARY KEY CLUSTERED (AccountID ASC)) 

INSERT INTO [dbo].[Accounts] VALUES ('1000', '2012-01-01', 1999.00) 
INSERT INTO [dbo].[Accounts] VALUES ('1001', '2012-01-02', 100.00) 
INSERT INTO [dbo].[Accounts] VALUES ('1002', '2012-02-05', 350.00) 
INSERT INTO [dbo].[Accounts] VALUES ('1003', '2012-03-01', 625.00) 
INSERT INTO [dbo].[Accounts] VALUES ('1004', '2012-03-10', 50.00) 
INSERT INTO [dbo].[Accounts] VALUES ('1005', '2012-03-10', 10.00) 

तालिका 2: ट्रांस पटरियों भुगतान

CREATE TABLE [dbo].[Trans](
    [TranID] [int] IDENTITY(1,1) NOT NULL, 
    [AccountID] [nchar](10) NOT NULL, 
    [TranDate] [date] NOT NULL, 
    [TranAmount] [money] NOT NULL, 
CONSTRAINT [PK_Trans] PRIMARY KEY CLUSTERED (TranID ASC)) 

INSERT INTO [dbo].[Trans] VALUES (1000, '2012-01-15', 300.00) 
INSERT INTO [dbo].[Trans] VALUES (1000, '2012-02-15', 300.00) 
INSERT INTO [dbo].[Trans] VALUES (1000, '2012-03-15', 300.00) 
INSERT INTO [dbo].[Trans] VALUES (1002, '2012-02-20', 325.00) 
INSERT INTO [dbo].[Trans] VALUES (1002, '2012-04-20', 25.00) 
INSERT INTO [dbo].[Trans] VALUES (1003, '2012-03-24', 625.00) 
INSERT INTO [dbo].[Trans] VALUES (1004, '2012-03-28', 31.00) 
INSERT INTO [dbo].[Trans] VALUES (1004, '2012-04-12', 5.00) 
INSERT INTO [dbo].[Trans] VALUES (1005, '2012-04-08', 7.00) 
INSERT INTO [dbo].[Trans] VALUES (1005, '2012-04-28', 3.00) 

बनाया यहाँ वांछित आउटपुट की तरह

        *Total Payments in Each Month* 
SubmissionYearMonth TotalAmount | 2012-01 2012-02 2012-03 2012-04 
-------------------------------------------------------------------- 
2012-01    2099.00  | 300.00 300.00 300.00  0.00 
2012-02    350.00  |   325.00  0.00 25.00 
2012-03    685.00  |     656.00 15.00 

पहले दो स्तंभों महीने से समूहीकरण Account.Amount योग दिखना चाहिए।

अंतिम 4 कॉलम वर्तमान पंक्ति के दिए गए महीने में रखे गए खातों के लिए Tran.TranAmount, महीने के अनुसार।

मैं जिस प्रश्न के साथ काम कर रहा हूं, वह करीब महसूस कर रहा है। मैं सिर्फ अंतराल सही नहीं है।

Select SubmissionYearMonth, 
     TotalAmount, 
     pt.[0] AS MonthOld0, 
     pt.[1] AS MonthOld1, 
     pt.[2] AS MonthOld2, 
     pt.[3] AS MonthOld3, 
     pt.[4] AS MonthOld4, 
     pt.[5] AS MonthOld5, 
     pt.[6] AS MonthOld6, 
     pt.[7] AS MonthOld7, 
     pt.[8] AS MonthOld8, 
     pt.[9] AS MonthOld9, 
     pt.[10] AS MonthOld10, 
     pt.[11] AS MonthOld11, 
     pt.[12] AS MonthOld12, 
     pt.[13] AS MonthOld13 

From (
     SELECT Convert(Char(4),Year(SubmissionDate)) + '-' + Right('00' + Convert(VarChar(2), DatePart(Month, SubmissionDate)),2) AS SubmissionYearMonth, 
     SUM(Amount) AS TotalAmount 
     FROM Accounts 
     GROUP BY Convert(Char(4),Year(SubmissionDate)) + '-' + Right('00' + Convert(VarChar(2), DatePart(Month, SubmissionDate)),2) 
    ) 
AS AccountSummary 
OUTER APPLY 
(
SELECT * 
FROM (
     SELECT CASE WHEN DATEDIFF(Month, SubmissionDate, TranDate) < 13 
        THEN DATEDIFF(Month, SubmissionDate, TranDate) 
        ELSE 13 
       END AS PaymentMonthAge, 
       TranAmount 
     FROM Trans INNER JOIN Accounts ON Trans.AccountID = Accounts.AccountID 
     Where Convert(Char(4),Year(TranDate)) + '-' + Right('00' + Convert(VarChar(2), DatePart(Month, TranDate)),2) 
      = AccountSummary.SubmissionYearMonth 
     ) as TransTemp 
     PIVOT (SUM(TranAmount) 
       FOR PaymentMonthAge IN ([0], 
             [1], 
             [2], 
             [3], 
             [4], 
             [5], 
             [6], 
             [7], 
             [8], 
             [9], 
             [10], 
             [11], 
             [12], 
             [13])) as TransPivot 
) as pt 

यह निम्न उत्पादन उत्पादन है:

SubmissionYearMonth TotalAmount MonthOld0 MonthOld1 MonthOld2 MonthOld3 ... 
2012-01    2099.00  300.00 NULL  NULL  NULL  ... 
2012-02    350.00  325.00 300.00 NULL  NULL  ... 
2012-03    685.00  656.00 NULL  300.00 NULL  ... 

स्तंभ तारीख हेडर के लिए के रूप में क्वेरी मैं अब तक के साथ काम कर रहा हूँ है। मुझे यकीन नहीं है कि सबसे अच्छा विकल्प यहाँ क्या है। मैं कॉलम का एक अतिरिक्त सेट जोड़ सकता हूं और एक गणना मूल्य बना सकता हूं जिसे मैं परिणामी रिपोर्ट में उपयोग कर सकता हूं।

एसक्यूएल फिडल: http://www.sqlfiddle.com/#!6/272e5/1/0

किसी भी सहायता के लिए धन्यवाद।

+9

** उत्कृष्ट ** नौकरी नमूना डेटा और प्रश्नों सहित। इस तरह हर सवाल लिखा जाना चाहिए! – mellamokb

+3

@mellamokb: प्लस [SQLFiddle] (http://sqlfiddle.com) के लिए एक लिंक और यह सही होगा :) –

+2

@juergend: दरअसल। ओपी की क्वेरी यहां दी गई है: http://www.sqlfiddle.com/#!3/56223/1 – mellamokb

उत्तर

1

Thomas, मैं निम्नलिखित समाधान मैं का उपयोग कर समाप्त हो गया के लिए प्रेरणा के रूप में आपकी प्रतिक्रिया का इस्तेमाल किया।

मैं पहले सबमिशनडेट बनाता हूं, ट्रैनडेट क्रॉस कंकाल डेट मैट्रिक्स में शामिल होता है, जिसे बाद में मैं खातासमरी और ट्रैनसमरी डेटा में शामिल होने के लिए उपयोग करता हूं।

परिणामी क्वेरी आउटपुट प्रति ट्रैनडेट महीने के कॉलम में स्वरूपित नहीं है। इसके बजाय मैं वांछित स्वरूपित आउटपुट प्राप्त करने के लिए, एक SQL सर्वर रिपोर्टिंग सेवा मैट्रिक्स में आउटपुट का उपयोग कर रहा हूं, और TranSummaryMonthNum कॉलम के आधार पर कॉलम ग्रुपिंग का उपयोग कर रहा हूं।

SQL Fiddle version

; 
WITH 
    --Generate a list of Dates, from the first SubmissionDate, through today. 
    --Note: Requires the use of: 'OPTION (MAXRECURSION 0)' to generate a list with more than 100 dates. 
    CTE_AutoDates AS 
    (Select Min(SubmissionDate) as FiscalDate 
     From Accounts 
     UNION ALL 
     SELECT DATEADD(Day, 1, FiscalDate) 
     FROM CTE_AutoDates 
     WHERE DATEADD(Day, 1, FiscalDate) <= GetDate() 
    ), 

    FiscalDates As 
    (SELECT FiscalDate, 
      DATEFROMPARTS(Year(FiscalDate), Month(FiscalDate), 1) as FiscalMonthStartDate 
     FROM CTE_AutoDates 
     --Optionaly filter Fiscal Dates by the last known Math.Max(SubmissionDate, TranDate) 
     Where FiscalDate <= (Select Max(MaxDate) 
          From (Select Max(SubmissionDate) as MaxDate From Accounts 
           Union All 
           Select Max(TranDate) as MaxDate From Trans 
           ) as MaxDates 
         ) 
    ), 

    FiscalMonths as 
    (SELECT Distinct FiscalMonthStartDate 
     FROM FiscalDates 
    ), 

    --Matrix to store the reporting date groupings for the Account submission and payment periods. 
    SubmissionAndTranMonths AS 
    (Select AM.FiscalMonthStartDate as SubmissionMonthStartDate, 
      TM.FiscalMonthStartDate as TransMonthStartDate, 
      DateDiff(Month, (Select Min(FiscalMonthStartDate) From FiscalMonths), TM.FiscalMonthStartDate) as TranSummaryMonthNum 
     From FiscalMonths AS AM 
      Join FiscalMonths AS TM 
      ON TM.FiscalMonthStartDate >= AM.FiscalMonthStartDate 
    ), 

    AccountData as 
    (Select A.AccountID, 
      A.Amount, 
      FD.FiscalMonthStartDate as SubmissionMonthStartDate 
     From Accounts as A 
      Inner Join FiscalDates as FD 
      ON A.SubmissionDate = FD.FiscalDate 
    ), 


    TranData as 
    (Select T.AccountID, 
      T.TranAmount, 
      AD.SubmissionMonthStartDate, 
      FD.FiscalMonthStartDate as TranMonthStartDate 
     From Trans as T 
      Inner Join AccountData as AD 
      ON T.AccountID = AD.AccountID 
      Inner Join FiscalDates AS FD 
      ON T.TranDate = FD.FiscalDate 
    ), 

    AccountSummaryByMonth As 
    (Select ASM.FiscalMonthStartDate, 
      Sum(AD.Amount) as TotalSubmissionAmount 
     From FiscalMonths as ASM 
      Inner Join AccountData as AD 
      ON ASM.FiscalMonthStartDate = AD.SubmissionMonthStartDate 
     Group By 
      ASM.FiscalMonthStartDate 
    ), 

    TranSummaryByMonth As 
    (Select STM.SubmissionMonthStartDate, 
      STM.TransMonthStartDate, 
      STM.TranSummaryMonthNum, 
      Sum(TD.TranAmount) as TotalTranAmount 
     From SubmissionAndTranMonths as STM 
      Inner Join TranData as TD 
      ON STM.SubmissionMonthStartDate = TD.SubmissionMonthStartDate 
       AND STM.TransMonthStartDate = TD.TranMonthStartDate 
     Group By 
      STM.SubmissionMonthStartDate, 
      STM.TransMonthStartDate, 
      STM.TranSummaryMonthNum 
    ) 

--#Inspect 1 
--Select * From SubmissionAndTranMonths 
--OPTION (MAXRECURSION 0) 

--#Inspect 1 Results 
--SubmissionMonthStartDate TransMonthStartDate TranSummaryMonthNum 
--2012-01-01    2012-01-01   0 
--2012-01-01    2012-02-01   1 
--2012-01-01    2012-03-01   2 
--2012-01-01    2012-04-01   3 
--2012-02-01    2012-02-01   1 
--2012-02-01    2012-03-01   2 
--2012-02-01    2012-04-01   3 
--2012-03-01    2012-03-01   2 
--2012-03-01    2012-04-01   3 
--2012-04-01    2012-04-01   3 

--#Inspect 2 
--Select * From AccountSummaryByMonth 
--OPTION (MAXRECURSION 0) 

--#Inspect 2 Results 
--FiscalMonthStartDate TotalSubmissionAmount 
--2012-01-01   2099.00 
--2012-02-01   350.00 
--2012-03-01   685.00 

--#Inspect 3 
--Select * From TranSummaryByMonth 
--OPTION (MAXRECURSION 0) 

--#Inspect 3 Results 
--SubmissionMonthStartDate TransMonthStartDate TranSummaryMonthNum TotalTranAmount 
--2012-01-01    2012-01-01   0     300.00 
--2012-01-01    2012-02-01   1     300.00 
--2012-01-01    2012-03-01   2     300.00 
--2012-02-01    2012-02-01   1     325.00 
--2012-02-01    2012-04-01   3     25.00 
--2012-03-01    2012-03-01   2     656.00 
--2012-03-01    2012-04-01   3     15.00 

Select STM.SubmissionMonthStartDate, 
     ASM.TotalSubmissionAmount, 
     STM.TransMonthStartDate, 
     STM.TranSummaryMonthNum, 
     TSM.TotalTranAmount 
From SubmissionAndTranMonths as STM 
    Inner Join AccountSummaryByMonth as ASM 
     ON STM.SubmissionMonthStartDate = ASM.FiscalMonthStartDate 
    Left Join TranSummaryByMonth AS TSM 
     ON STM.SubmissionMonthStartDate = TSM.SubmissionMonthStartDate 
      AND STM.TransMonthStartDate = TSM.TransMonthStartDate 
Order By STM.SubmissionMonthStartDate, STM.TranSummaryMonthNum 
OPTION (MAXRECURSION 0) 

--#Results 
--SubmissionMonthStartDate TotalSubmissionAmount TransMonthStartDate TranSummaryMonthNum TotalTranAmount 
--2012-01-01    2099.00    2012-01-01   0     300.00 
--2012-01-01    2099.00    2012-02-01   1     300.00 
--2012-01-01    2099.00    2012-03-01   2     300.00 
--2012-01-01    2099.00    2012-04-01   3     NULL 
--2012-02-01    350.00    2012-02-01   1     325.00 
--2012-02-01    350.00    2012-03-01   2     NULL 
--2012-02-01    350.00    2012-04-01   3     25.00 
--2012-03-01    685.00    2012-03-01   2     656.00 
--2012-03-01    685.00    2012-04-01   3     15.00 
+3

प्रिय नाथन, अगर किसी ने आपकी क्वेरी के साथ आपको काफी मदद की है, तो मेरी राय में आपको अपना खुद का प्रदान करने और इसे चुनने के बजाय उस व्यक्ति का जवाब चुनना चाहिए। – ErikE

1

निम्नलिखित क्वेरी आप जो चाहते हैं उसे काफी अधिक लौटाती है। आपको अलग-अलग संचालन करने की ज़रूरत है। मैं सिर्फ परिणामों को एक साथ जोड़ता हूं:

select a.yyyymm, a.Amount, 
     t201201, t201202, t201203, t201204 
from (select LEFT(convert(varchar(255), a.submissiondate, 121), 7) as yyyymm, 
       SUM(a.Amount) as amount 
     from Accounts a 
     group by LEFT(convert(varchar(255), a.submissiondate, 121), 7) 
    ) a left outer join 
     (select LEFT(convert(varchar(255), a.submissiondate, 121), 7) as yyyymm, 
       sum(case when trans_yyyymm = '2012-01' then tranamount end) as t201201, 
       sum(case when trans_yyyymm = '2012-02' then tranamount end) as t201202, 
       sum(case when trans_yyyymm = '2012-03' then tranamount end) as t201203, 
       sum(case when trans_yyyymm = '2012-04' then tranamount end) as t201204 
     from Accounts a join 
      (select t.*, LEFT(convert(varchar(255), t.trandate, 121), 7) as trans_yyyymm 
      from trans t 
      ) t 
      on a.accountid = t.accountid 
     group by LEFT(convert(varchar(255), a.submissiondate, 121), 7) 
    ) t 
     on a.yyyymm = t.yyyymm 
order by 1 

मुझे एक न्यूल मिल रहा है जहां आपके पास दो कक्षों में 0.00 है।

+0

डेट रेंज एंडपॉइंट्स क्वेरीटाइम पर नहीं जानते हैं। प्रत्येक बार क्वेरी चलने पर, यह सभी ज्ञात खाता सबमिशन महीनों के लिए पंक्तियों की एक सूची तैयार करेगी, साथ ही एक निश्चित या संभावित रूप से भुगतान महीने सारांश कॉलम की संख्या। कुछ अतिरिक्त नल एक बड़ा सौदा नहीं है। – Nathan

5

चूंकि आप SQL Server 2012 का उपयोग कर रहे हैं, इसलिए हम तिथि को सुंदर बनाने के लिए प्रारूप फ़ंक्शन का उपयोग कर सकते हैं। तारों से समूह करने की कोई आवश्यकता नहीं है। इसके बजाए, मुझे उचित डेटा प्रकार का उपयोग करने के लिए उपयोगी लगता है जब तक कि मैं कर सकता हूं और केवल प्रारूप या प्रारूप पर कनवर्ट कर सकता हूं (या बिलकुल नहीं और मध्यम स्तर को डिस्प्ले को संभालने दें)।

इस समाधान में, मैंने मनमाने ढंग से उस महीने के पहले दिन, सबसे पहले ट्रांसडेट और इसे निकाला। हालांकि, कोई उस अभिव्यक्ति को वांछित प्रारंभ तिथि के स्थिर मूल्य के साथ आसानी से बदल सकता है और यह समाधान उस और अगले 12 महीनों में ले जाएगा।

With SubmissionMonths As 
    (
    Select DateAdd(d, -Day(A.SubmissionDate) + 1, A.SubmissionDate) As SubmissionMonth 
    , A.Amount 
    From dbo.Accounts As A 
) 
    , TranMonths As 
    (
    Select DateAdd(d, -Day(Min(T.TranDate)) + 1, Min(T.TranDate)) As TranMonth 
     , 1 As MonthNum 
    From dbo.Accounts As A 
    Join dbo.Trans As T 
     On T.AccountId = A.AccountId 
    Join SubmissionMonths As M 
     On A.SubmissionDate >= M.SubmissionMonth 
     And A.SubmissionDate < DateAdd(m,1,SubmissionMonth) 
    Union All 
    Select DateAdd(m, 1, TranMonth), MonthNum + 1 
    From TranMonths 
    Where MonthNum < 12 
) 
    , TotalBySubmissionMonth As 
    (
    Select M.SubmissionMonth, Sum(M.Amount) As Total 
    From SubmissionMonths As M 
    Group By M.SubmissionMonth 
) 
Select Format(SMT.SubmissionMonth,'yyyy-MM') As SubmissionMonth, SMT.Total 
    , Sum(Case When TM.MonthNum = 1 Then T.TranAmount End) As Month1 
    , Sum(Case When TM.MonthNum = 2 Then T.TranAmount End) As Month2 
    , Sum(Case When TM.MonthNum = 3 Then T.TranAmount End) As Month3 
    , Sum(Case When TM.MonthNum = 4 Then T.TranAmount End) As Month4 
    , Sum(Case When TM.MonthNum = 5 Then T.TranAmount End) As Month5 
    , Sum(Case When TM.MonthNum = 6 Then T.TranAmount End) As Month6 
    , Sum(Case When TM.MonthNum = 7 Then T.TranAmount End) As Month7 
    , Sum(Case When TM.MonthNum = 8 Then T.TranAmount End) As Month8 
    , Sum(Case When TM.MonthNum = 9 Then T.TranAmount End) As Month9 
    , Sum(Case When TM.MonthNum = 10 Then T.TranAmount End) As Month10 
    , Sum(Case When TM.MonthNum = 11 Then T.TranAmount End) As Month11 
    , Sum(Case When TM.MonthNum = 12 Then T.TranAmount End) As Month12 
From TotalBySubmissionMonth As SMT 
    Join dbo.Accounts As A 
    On A.SubmissionDate >= SMT.SubmissionMonth 
     And A.SubmissionDate < DateAdd(m,1,SMT.SubmissionMonth) 
    Join dbo.Trans As T 
    On T.AccountId = A.AccountId 
    Join TranMonths As TM 
    On T.TranDate >= TM.TranMonth 
     And T.TranDate < DateAdd(m,1,TM.TranMonth) 
Group By SMT.SubmissionMonth, SMT.Total 

SQL Fiddle version

+0

यह बहुत ही आशाजनक लग रहा है। मैं इसके साथ थोड़ा सा झुकाव जा रहा हूं और देख सकता हूं कि मैं इस कार्यान्वयन का उपयोग कर सकता हूं या नहीं। धन्यवाद। एक अच्छे उत्तर के लिए – Nathan

+0

+1। इसके अलावा, ओपी को आपके उत्तर को चयनित के रूप में चिह्नित करना चाहिए क्योंकि उसे समाधान प्राप्त करना महत्वपूर्ण था। – ErikE

1

निम्नलिखित जिज्ञासा your final query in your own answer के परिणाम डुप्लिकेट लेकिन इससे अधिक नहीं 1/30 सीपीयू (या बेहतर) लेता है, के साथ साथ एक बहुत सरल है।

यदि मेरे पास समय & ऊर्जा था तो मुझे यकीन है कि मुझे और भी सुधार मिल सकते हैं ... मेरा आंत मुझे बताता है कि मुझे Accounts तालिका को कई बार हिट नहीं करना पड़ेगा। लेकिन किसी भी मामले में, यह एक बड़ा सुधार है और बहुत बड़े परिणाम सेट के लिए भी बहुत अच्छा प्रदर्शन करना चाहिए।

the SqlFiddle for it देखें।

WITH L0 AS (SELECT 1 N UNION ALL SELECT 1), 
L1 AS (SELECT 1 N FROM L0, L0 B), 
L2 AS (SELECT 1 N FROM L1, L1 B), 
L3 AS (SELECT 1 N FROM L2, L2 B), 
L4 AS (SELECT 1 N FROM L3, L2 B), 
Nums AS (SELECT N = Row_Number() OVER (ORDER BY (SELECT 1)) FROM L4), 
Anchor AS (
    SELECT MinDate = DateAdd(month, DateDiff(month, '20000101', Min(SubmissionDate)), '20000101') 
    FROM dbo.Accounts 
), 
MNums AS (
    SELECT N 
    FROM Nums 
    WHERE 
     N <= DateDiff(month, 
     (SELECT MinDate FROM Anchor), 
     (SELECT Max(TranDate) FROM dbo.Trans) 
    ) + 1 
), 
A AS (
    SELECT 
     AM.AccountMo, 
     Amount = Sum(A.Amount) 
    FROM 
     dbo.Accounts A 
     CROSS APPLY (
     SELECT DateAdd(month, DateDiff(month, '20000101', A.SubmissionDate), '20000101') 
    ) AM (AccountMo) 
    GROUP BY 
     AM.AccountMo 
), T AS (
    SELECT 
     AM.AccountMo, 
     TM.TranMo, 
     TotalTranAmount = Sum(T.TranAmount) 
    FROM 
     dbo.Accounts A 
     CROSS APPLY (
     SELECT DateAdd(month, DateDiff(month, '20000101', A.SubmissionDate), '20000101') 
    ) AM (AccountMo) 
     INNER JOIN dbo.Trans T 
     ON A.AccountID = T.AccountID 
     CROSS APPLY (
     SELECT DateAdd(month, DateDiff(month, '20000101', T.TranDate), '20000101') 
    ) TM (TranMo) 
    GROUP BY 
     AM.AccountMo, 
     TM.TranMo 
) 
SELECT 
    SubmissionStartMonth = A.AccountMo, 
    TotalSubmissionAmount = A.Amount, 
    M.TransMonth, 
    TransMonthNum = N.N - 1, 
    T.TotalTranAmount 
FROM 
    A 
    INNER JOIN MNums N 
     ON N.N >= DateDiff(month, (SELECT MinDate FROM Anchor), A.AccountMo) + 1 
    CROSS APPLY (
     SELECT TransMonth = DateAdd(month, N.N - 1, (SELECT MinDate FROM Anchor)) 
    ) M 
    LEFT JOIN T 
     ON A.AccountMo = T.AccountMo 
     AND M.TransMonth = T.TranMo 
ORDER BY 
    A.AccountMo, 
    M.TransMonth; 
संबंधित मुद्दे