iT邦幫忙

2

ms sql 有辦法做出這種select嗎? (sql code)

sql

因上司的要求
說資料就是要一整排顯示
才能夠分析需要的數據
但這個要求讓我很困擾.......
請問sql有辦法做出這種數據顯示方式嗎
謝謝大家...

https://ithelp.ithome.com.tw/upload/images/20190912/20103088B9czZAdotu.png

石頭 iT邦研究生 3 級 ‧ 2019-09-12 09:47:44 檢舉
Dynamic pivot .
2
rogeryao
iT邦研究生 1 級 ‧ 2019-09-12 11:51:03
最佳解答
CREATE TABLE TEST
(a1 nvarchar(20),a2 nvarchar(20), a3 nvarchar(20),a4 nvarchar(20),a5 nvarchar(20));
INSERT INTO TEST SELECT a1='AAA',a2='20190911',a3='1111-111',a4='10',a5=N'生鏽';
INSERT INTO TEST SELECT a1='AAA',a2='20190911',a3='1111-111',a4='30',a5=N'不良';
INSERT INTO TEST SELECT a1='BBB',a2='20191001',a3='2222-222',a4='50',a5=N'試做';
INSERT INTO TEST SELECT a1='BBB',a2='20191001',a3='2222-222',a4='70',a5=N'休息';
INSERT INTO TEST SELECT a1='AAA',a2='20190911',a3='1111-111',a4='20',a5=N'磨損';
INSERT INTO TEST SELECT a1='BBB',a2='20191001',a3='2222-222',a4='40',a5=N'調機';
INSERT INTO TEST SELECT a1='BBB',a2='20191001',a3='2222-222',a4='60',a5=N'加工';
SELECT a1,a2,a3,
MAX(CASE [a4_code] WHEN 'code1' THEN a4 ELSE '' END) N'code1',
MAX(CASE [a5_reason] WHEN 'reason1' THEN a5 ELSE '' END) N'reason1',	
MAX(CASE [a4_code] WHEN 'code2' THEN a4 ELSE '' END) N'code2',
MAX(CASE [a5_reason] WHEN 'reason2' THEN a5 ELSE '' END) N'reason2',
MAX(CASE [a4_code] WHEN 'code3' THEN a4 ELSE '' END) N'code3',
MAX(CASE [a5_reason] WHEN 'reason3' THEN a5 ELSE '' END) N'reason3',
MAX(CASE [a4_code] WHEN 'code4' THEN a4 ELSE '' END) N'code4',
MAX(CASE [a5_reason] WHEN 'reason4' THEN a5 ELSE '' END) N'reason4'
FROM 
(
select a1,a2,a3,a4,a5,
'code'+convert(varchar,row_number()
over(partition by a1,a2,a3 order by a1,a2,a3,a4)) as a4_code,
'reason'+convert(varchar,row_number()
over(partition by a1,a2,a3 order by a1,a2,a3,a4)) as a5_reason
from TEST
) as N
GROUP BY a1,a2,a3
ORDER BY a1,a2,a3

Demo

z22344566 iT邦新手 5 級 ‧ 2019-09-12 12:02:38 檢舉

非常感謝!!!!!!!!!!!!

1
小魚
iT邦高手 1 級 ‧ 2019-09-12 08:36:28

如果你想練習SQL,
可以試試看,
要不然我覺得後端語言作起來更容易.

dragonH iT邦大師 6 級 ‧ 2019-09-12 09:09:23 檢舉

換個標題求 sql code /images/emoticon/emoticon39.gif

0
fuzzylee1688
iT邦新手 2 級 ‧ 2019-09-12 09:29:34

善用GROUP/MAX(CASE WHEN)/ROW_NUMBER() OVER (PARTITION BY )即可.

1
浩瀚星空
iT邦大師 1 級 ‧ 2019-09-12 11:17:20

其實是有對應的語法可以用。
可是一般並不太建議從sql語法來改變呈現方式。

因為結合的筆數少也就算了。
結合的筆數多,就會炸給你看了。

最好還是從其它方式來處理會安全點。

同意這回答。
現在是因為資料只有7筆,如果有700萬筆勒?
寫給我看看...

我覺得這類型的議題應該是「溝通」而不是語法怎麼寫,
去了解為什麼需求端需要這樣的呈現?為了達成什麼目的?
進而使用適合以SQL進行的手法,並達到...
【並非需求端要求的呈現,但仍能達成需求端想要的目的。】
這才是上策。

如果硬性要符合原題目的呈現要求,那其實就不適合用SQL寫。
這題還好是個結構化呈現,講個更過份的,
如果上司要的呈現長相是非結構化的勒,難道用SQL硬拚嗎?

z22344566 iT邦新手 5 級 ‧ 2019-09-17 12:04:59 檢舉

小弟受教了,謝謝建議!

我要發表回答

立即登入回答