Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

एकाधिक पंक्तियों को एक पंक्ति में संयोजित करें

आपके पास उस तरह के कॉलम की डायनामिक संख्या नहीं हो सकती है, लेकिन आप अपना डेटा संयोजित कर सकते हैं स्ट्रिंग में:

select
    s.ItemID, s.Code, s.Name,
    stuff(
        (
            select ', ' + CAST(sv.SearchValueID AS VARCHAR)
            from ItemSearch as sv
            where sv.ItemID = s.ItemID
            for xml path(''), type
        ).value('.', 'nvarchar(128)')
    , 1, 2, '') as SearchValues
from Item as s;

या आप पंक्तियों को धुरी . कर सकते हैं PIVOT कमांड या मैन्युअल रूप से (मैं बाद के दृष्टिकोण को पसंद करता हूं, यह मेरे लिए अधिक लचीला लगता है, लेकिन पिवट कुछ स्थितियों में कोड की मात्रा को बहुत कम कर सकता है ):

with cte as (
    select
        *,
        row_number() over(partition by sv.ItemID order by sv.SearchValueID) as row_num
    from ItemSearch as sv
)
select
    s.ItemID, s.Code, s.Name,
    max(case when sv.row_num = 1 then sv.SearchValueID end) as SearchValueID1,
    max(case when sv.row_num = 2 then sv.SearchValueID end) as SearchValueID2,
    max(case when sv.row_num = 3 then sv.SearchValueID end) as SearchValueID3,
    max(case when sv.row_num = 4 then sv.SearchValueID end) as SearchValueID4
from Item as s
    inner join cte as sv on sv.ItemID = s.ItemID
group by s.ItemID, s.Code, s.Name

आप पिछले स्टेटमेंट को डायनामिक SQL में भी बदल सकते हैं इस तरह:

declare @stmt nvarchar(max)

select
    @stmt = 
        isnull(@stmt + ',','') + 
        'max(case when sv.row_num = ' + cast(rn as nvarchar(max)) +
        ' then sv.SearchValueID end) as SearchValueID' + cast(rn as nvarchar(max))
from (
    select distinct row_number() over(partition by ItemID order by SearchValueID) as rn
    from ItemSearch
) as a

select @stmt = '
    with cte as (
        select
            *,
            row_number() over(partition by sv.ItemID order by sv.SearchValueID) as row_num
        from ItemSearch as sv
    )
    select
        s.ItemID, s.Code, s.Name,' + @stmt + '
    from Item as s
        inner join cte as sv on sv.ItemID = s.ItemID
    group by s.ItemID, s.Code, s.Name;'

exec dbo.sp_executesql @stmt = @stmt

sql fiddle डेमो




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. अमान्य ऑब्जेक्ट नाम SQL Server 2008 R2 - संग्रहीत कार्यविधि

  2. 'XQuery' SQL का अनुकूलन कैसे करें

  3. क्या हम SQL में एक दृश्य के लिए पैरामीटर पास कर सकते हैं?

  4. ची-स्क्वायर टेस्ट के लिए SQL क्वेरी

  5. SQL सर्वर:CREATE DATABASE में पैरामीटर का उपयोग करें