pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

是否可以在 T-SQL 中將行轉換為可變數量的列?

Is it possible to convert rows to a variable number of columns in T-SQL?(是否可以在 T-SQL 中將行轉換為可變數量的列?)
本文介紹了是否可以在 T-SQL 中將行轉換為可變數量的列?的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

我有一個奇怪的要求,我需要將可變數量的行轉換為列.我需要幫助確定這是否可以在 SQL 中完成,或者我是否應該只用不同的語言編寫程序.

I have a strange requirement where I need to convert a variable amount of rows into columns. I need help figuring out if this could be done in SQL, or if I should just write a program in a different language.

假設我有一個表 Clients,它只保存最少的客戶端數據.然后是一個名為 Attributes 的表,它命名了不同的可能屬性(例如,電話號碼、地址等).最后,我有第三個表 ClientAttributes,其中包含兩個 FK 和值.

Let's assume I have a table Clients, which only holds minimal client data. Then, a table called Attributes, which names the different possible attributes (say, Phone number, address, etc). Finally, I have the third table, ClientAttributes which holds the two FKs and the value.

因此,對于每個客戶端,我都有任意數量的屬性.客戶端可以有零個、1 個或無限個電話號碼、零個、1 個或無限個地址,等等.

So for each client I have any number of attributes. A client can have zero, 1 or infinite phone numbers, zero, 1, or infinite addresses, and so on.

我需要的是所有數據的表格視圖.客戶名稱、電話、電話 2、電話 3、...、地址、地址 2、地址 3.... 等等.如果客戶端沒有這樣的值,則該值將為空.顯然這意味著每次執行查詢時列數可能不同.

What I need is a table view of all that data. Client Name, Phone, Phone 2, Phone 3, ..., Address, Address 2, Address 3.... and so on. If a client has no such value, the value will be null. Obviously this means that the number of columns may be different every time the query is executed.

這需要與 SQL Server 2008 兼容.

This needs to be compatible as far back as SQL Server 2008.

這可以完全在 T-SQL 中完成,還是應該通過轉儲數據并讓 C# 處理它來完成這個客戶端?我可以在 C# 中輕松完成,但我不確定這是否可以在 SQL 中完成.SQL 將是首選,因為數據集可能太大而無法放入 RAM.

Could this be done purely in T-SQL, or should do this client-side by just dumping the data and let C# handle it? I could easily do it in C# but I'm not sure this could be done in SQL. SQL would be preferred because the dataset may be too large to fit in RAM.

推薦答案

如果需要,這可以通過動態 sql 在 SQL 中完成.為一個項目(我將使用電話)執行此操作的基本理論如下,您可以為所需的其他列分組重復此操作.請注意,沒有人會說它很漂亮.

This can be done in SQL through dynamic sql, if you need to. The basic theory for doing it for one item (I'll use phone) is as follows, you'd repeat this for each other grouping of columns you want. Note that no one will ever say that it is pretty.

  • 創建一個基本查詢(CTE、TEMP 表等),獲取每個有效電話號碼的客戶端 ID、電話.添加行號ROW_NUMBER() OVER (PARTITION BY ClientID ORDER BY (whatever))" - 我將其稱為 basedata
  • 從 basedata 中獲取最大 row_number - 這是您需要的電話列數

通過從 i = 1 循環到 MaxRowNo 來制作動態 SQL 查詢字符串的一部分.在每個循環中,您構建一個選擇字符串和一個連接字符串.選擇字符串應在每個循環中添加如下內容

Make parts of a dynamic SQL query string by looping from i = 1 to MaxRowNo. In each loop, you build up a selection string, and a join string. The selection string should add something like the following in each loop

Set @SelectStr = @SelectStr + 'P' + cast(i as varchar(10)) + '.Phone,';

連接字符串應該在每個循環中添加類似這樣的東西

The join string should add something like this in each loop

Set @JoinStr = @JoinStr + ' left outer join baseData P' + cast(i as varchar(10)) + ' on P' + cast(i as varchar(10)) + '.ClientID = C.ClientID and P' + cast(i as varchar(10)) + '.RowNo = ' + cast(i as varchar(10));

您可以對地址和任何其他重復的列組重復上述整個過程 - 確保不要在別名上加倍.然后,您將通過添加查詢的任何固定的、不變的部分(客戶端數據)來組成最終的動態 sql 查詢,就像這樣

You would repeat the whole above process for addresses, and any other repeating groups of columns - make sure you don't double up on alias names. Then you would make up your final dynamic sql query by adding any fixed, unchanging parts of the query (client data), something like this

Set @FinalQuery = 'SELECT C.ClientID, C.ClientName, ' + @SelectStr + ' From Client C ' + @JoinStr

您最終建立的查詢(假設最多有三個電話和兩個地址作為示例)將如下所示 - 然后執行此字符串

Your final built up query (assuming there is max three phones and two addresses as an example) would look something like this - then EXEC this string

SELECT C.ClientID, C.ClientName, --any other client stuff you need here
   P1.Phone, P2.Phone, P3.Phone, A1.Address, A2.Address
From Client C
   left outer join baseData P1 on P1.ClientID = C.ClientID and P1.RowNo = 1
   left outer join baseData P2 on P2.ClientID = C.ClientID and P2.RowNo = 2
   left outer join baseData P3 on P3.ClientID = C.ClientID and P3.RowNo = 3
   left outer join baseAddr A1 on A1.ClientID = C.ClientID and A1.RowNo = 1
   left outer join baseAddr A2 on A2.ClientID = C.ClientID and A2.RowNo = 2

這篇關于是否可以在 T-SQL 中將行轉換為可變數量的列?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

Converting Every Child Tags in to a Single Column with multiple Delimiters -SQL Server (3)(將每個子標記轉換為具有多個分隔符的單列-SQL Server (3))
How can I create a view from more than one table?(如何從多個表創建視圖?)
Create calculated value based on calculated value inside previous row(根據前一行內的計算值創建計算值)
How do I stack the first two columns of a table into a single column, but also pair third column with the first column only?(如何將表格的前兩列堆疊成一列,但也僅將第三列與第一列配對?) - IT屋-程序員軟件開發技
Recursive t-sql query(遞歸 t-sql 查詢)
Convert Month Name to Date / Month Number (Combinations of Questions amp; Answers)(將月份名稱轉換為日期/月份編號(問題和答案的組合))
主站蜘蛛池模板: 大型冰雕-景区冰雕展制作公司,3D创意设计源头厂家-[赛北冰雕] | 振动筛-交叉筛-螺旋筛-滚轴筛-正弦筛-方形摇摆筛「新乡振动筛厂家」 | 变压器配件,变压器吸湿器,武强县吉口变压器配件有限公司 | 撕碎机_轮胎破碎机_粉碎机_回收生产线厂家_东莞华达机械有限公司 | 体检车_移动CT车_CT检查车_CT车_深圳市艾克瑞电气有限公司移动CT体检车厂家-深圳市艾克瑞电气有限公司 | 证券新闻,热播美式保罗1984第二部_腾讯1080p-仁爱影院 | 丝杆升降机-不锈钢丝杆升降机-非标定制丝杆升降机厂家-山东鑫光减速机有限公司 | 微型实验室真空泵-无油干式真空泵-微型涡旋耐腐蚀压缩机-思科涡旋科技(杭州)有限公司 | 安徽免检低氮锅炉_合肥燃油锅炉_安徽蒸汽发生器_合肥燃气锅炉-合肥扬诺锅炉有限公司 | 深圳市索富通实业有限公司-可燃气体报警器 | 可燃气体探测器 | 气体检测仪 | EFM 022静电场测试仪-套帽式风量计-静电平板监测器-上海民仪电子有限公司 | 管形母线,全绝缘铜管母线厂家-山东佰特电气科技有限公司 | 合肥礼品公司-合肥礼品定制-商务礼品定制公司-安徽柏榽商贸有限公司 | 扫地车厂家-山西洗地机-太原电动扫地车「大同朔州吕梁晋中忻州长治晋城洗地机」山西锦力环保科技有限公司 | ★店家乐|服装销售管理软件|服装店收银系统|内衣店鞋店进销存软件|连锁店管理软件|收银软件手机版|会员管理系统-手机版,云版,App | 立式壁挂广告机厂家-红外电容触摸一体机价格-华邦瀛 | 木材烘干机,木炭烘干机,纸管/佛香烘干设备-河南蓝天机械制造有限公司 | 山东柳店新能源科技有限公司| 苏州防水公司_厂房屋面外墙防水_地下室卫生间防水堵漏-苏州伊诺尔防水工程有限公司 | 河北凯普威医疗器材有限公司,高档轮椅系列,推车系列,座厕椅系列,协步椅系列,拐扙系列,卫浴系列 | 压缩空气检测_气体_水质找上海京工-服务专业、价格合理 | 浙江华锤电器有限公司_地磅称重设备_防作弊地磅_浙江地磅售后维修_无人值守扫码过磅系统_浙江源头地磅厂家_浙江工厂直营地磅 | 广州迈驰新GMP兽药包装机首页_药品包装机_中药散剂包装机 | 浇钢砖,流钢砖_厂家价低-淄博恒森耐火材料有限公司 | 黑龙江京科脑康医院-哈尔滨精神病医院哪家好_哈尔滨精神科医院排名_黑龙江精神心理病专科医院 | 电竞学校_电子竞技培训学校学院-梦竞未来电竞学校官网 | 半容积式换热器_北京浮动盘管换热器厂家|北京亿丰上达 | 旋片真空泵_真空泵_水环真空泵_真空机组-深圳恒才机电设备有限公司 | 恒温恒湿试验箱_高低温试验箱_恒温恒湿箱-东莞市高天试验设备有限公司 | 艾默生变频器,艾默生ct,变频器,ct驱动器,广州艾默生变频器,供水专用变频器,风机变频器,电梯变频器,艾默生变频器代理-广州市盟雄贸易有限公司官方网站-艾默生变频器应用解决方案服务商 | 双段式高压鼓风机-雕刻机用真空泵-绍兴天晨机械有限公司 | 台式核磁共振仪,玻璃软化点测定仪,旋转高温粘度计,测温锥和测温块-上海麟文仪器 | 沈飞防静电地板__机房地板-深圳市沈飞防静电设备有限公司 | 驾驶人在线_专业学车门户网站| 深圳善跑体育产业集团有限公司_塑胶跑道_人造草坪_运动木地板 | 工程管道/塑料管材/pvc排水管/ppr给水管/pe双壁波纹管等品牌管材批发厂家-河南洁尔康建材 | 塑料薄膜_PP薄膜_聚乙烯薄膜-常州市鑫美新材料包装厂 | 武汉天安盾电子设备有限公司 - 安盾安检,武汉安检门,武汉安检机,武汉金属探测器,武汉测温安检门,武汉X光行李安检机,武汉防爆罐,武汉车底安全检查,武汉液体探测仪,武汉安检防爆设备 | 坏男孩影院-提供最新电影_动漫_综艺_电视剧_迅雷免费电影最新观看 | 压砖机、液压制砖机、静压砖机、环保砖机生产厂家—杜甫机械 | 展厅设计-展馆设计-专业企业展厅展馆设计公司-昆明华文创意 |